通过 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