猿问

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

在我的应用程序中,用户上传了几个 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 开始工作


梵蒂冈之花
浏览 138回答 1
1回答

温温酱

创建一个类: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 中定义名称空间。
随时随地看视频慕课网APP

相关分类

Java
我要回答