gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 09:38:27 25 4
gpt4 key购买 nike

在我的应用程序中,用户上传了多个 XML。上传的 XML 很少不包含命名空间标签,而其他 XML 则包含该标签。我希望能够支持两者的上传。 JAXB 对前者给予异常(exception)。

我希望能够将命名空间设为可选,即支持这两个文件。

正在运行的 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 开始工作

最佳答案

创建一个类:

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 中定义 namespace 。

解决方案取自此 answer .

关于java - 通过 JAXB 解析 XML 的可选命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57307845/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com