为了账号安全,请及时绑定邮箱和手机立即绑定

可选的命名空间通过 JAXB 解析 XML

可选的命名空间通过 JAXB 解析 XML

梵蒂冈之花 2023-05-10 17:22:42
在我的应用程序中,用户上传了几个 XML。很少有上传的 XML 不包含命名空间标记,而其他的则包含它。我希望能够支持两者的上传。JAXB 对前者给予例外。我希望能够使命名空间成为可选的,即支持这两个文件。有效的 XML<?xml version="1.0" encoding="utf-8" standalone="yes"?><ns2:transforms xmlns:ns2="http://www.mynamesapace.com/xmlbeans/connectorconfig">失败的 XML<?xml version="1.0" encoding="utf-8" standalone="yes"?><transforms>这是我解组 XML 的方式  JAXBContext jaxbContext = JAXBContext.newInstance(Transforms.class);  Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();  transforms = (Transforms) jaxbUnmarshaller.unmarshal(file);这是我的pojo@XmlRootElement(name = "transforms", namespace = "http://www.mynamesapace.com/xmlbeans/connectorconfig")public class Transforms implements ConfigDiffable<Transforms, ChangedTransforms> {.....更新:如果我删除namespace =     "http://www.mynamesapace.com/xmlbeans/connectorconfig"没有命名空间的 XML 开始工作
查看完整描述

1 回答

?
温温酱

TA贡献1752条经验 获得超4个赞

创建一个类:


class XMLReaderWithoutNamespace extends StreamReaderDelegate {

  public XMLReaderWithoutNamespace(XMLStreamReader reader) {

    super(reader);

  }


  @Override

  public String getAttributeNamespace(int arg0) {

    return "";

  }


  @Override

  public String getNamespaceURI() {

    return "";

  }

}

将您的解组更改为:


JAXBContext jaxbContext = JAXBContext.newInstance(Transforms.class);

Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();

InputStream is = new FileInputStream(file);

XMLStreamReader xsr = XMLInputFactory.newFactory().createXMLStreamReader(is);

XMLReaderWithoutNamespace xr = new XMLReaderWithoutNamespace(xsr);

transforms = (Transforms) jaxbUnmarshaller.unmarshal(xr);

当我测试这个时,我没有在 pojo 中定义名称空间。



查看完整回答
反对 回复 2023-05-10
  • 1 回答
  • 0 关注
  • 137 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信