我是JAXB和XML的新手。
我有像
这样的XML<?xml...?>
<ns2:Envelope xmlns:ns2="http://www.w3.org/2003/05/soap-envelope"
xmlns="http://alpha..."
xmlns:ns3="http://gama...">
<ns2:Body>
<ns3:Mynode>
...
</ns3:Mynode>
</ns2:Body>
我有一个Mynode的XSD文件,并在其上运行jaxb,所以我有Mynode.java类。
我收到一个带有XML的String,我就像这样解析它:
DocumentBuilderFactory docFac = DocumentBuilderFactory.newInstance();
Document doc = docFac.newDocumentBuilder().parse(new ByteArrayInputStream(xml.getBytes()));
NodeList ns3mynode = doc.getElementsByTagName("ns3:Mynode");
JAXBContext jaxbContext = JAXBContext.newInstance(Mynode.class);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
return unmarshaller.unmarshal(node.item(0));
但是Java抛出一个异常,说他不期望命名空间ns3 ......这也很有意义。
哪种方法是从XML中提取ns3:Mynode,尊重名称空间?
谢谢!
答案 0 :(得分:1)
你所做的是好的,因为节点从父节点继承了命名空间声明(你没有提取子节点,你只是引用它)。您忘了在setNamespaceAware(true)
的实例上致电DocumentBuilderFactory
。
注意强>
在这个用例中使用DOM有点重,下面链接到我博客上的一篇文章,我使用JAXB和StAX做同样的事情: