通过 JAXB 的可选命名空间解析 XML
Optional Namespace parsing XML via JAXB
在我的应用程序中,用户上传了几个 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 没有命名空间开始工作
创建 class:
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 中定义命名空间。
解决方案取自此answer。
在我的应用程序中,用户上传了几个 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 没有命名空间开始工作
创建 class:
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 中定义命名空间。
解决方案取自此answer。