从Soap中提取XML节点

时间:2014-06-11 12:45:35

标签: jaxb

我是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,尊重名称空间?

谢谢!

1 个答案:

答案 0 :(得分:1)

你所做的是好的,因为节点从父节点继承了命名空间声明(你没有提取子节点,你只是引用它)。您忘了在setNamespaceAware(true)的实例上致电DocumentBuilderFactory

注意

在这个用例中使用DOM有点重,下面链接到我博客上的一篇文章,我使用JAXB和StAX做同样的事情: