【问题标题】:how to parse xml to java in nodelist如何在nodelist中将xml解析为java
【发布时间】:2018-05-09 14:11:52
【问题描述】:

那是我的 xml

<?xml version = "1.0" encoding = "UTF-8"?>
 <ns0:GetADSLProfileResponse xmlns:ns0 = "http://">
<ns0:Result>
    <ns0:eCode>0</ns0:eCode>
    <ns0:eDesc>Success</ns0:eDesc>
</ns0:Result>
</ns0:GetADSLProfileResponse> 

这是我在java中的代码我需要知道如何开始 我在网上尝试了一些代码,但仍然没有解决我的问题 如何获取结果中的值以在其中循环并在 ecode 中获取 0 并在 eDesc 中获取 Success

CustomerProfileResult pojo = new CustomerProfileResult();
    String body = readfile();
    System.out.println(body);
    try {  
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();
        Document dom = db.parse(new InputSource(new StringReader(body)));
        XPath xpath =XPathFactory.newInstance().newXPath();

        XPathExpression name = xpath.compile("/xml/GetADSLProfileResponse/Result");
        NodeList nodeName = (NodeList) name.evaluate(dom, XPathConstants.NODESET);

        if(nodeName!=null){

        } 

【问题讨论】:

  • 你可以使用其他库吗?
  • 任何链接将不胜感激,谢谢
  • 我在 JacksonXML 方面拥有丰富的经验。如果您可以拉入该库,它将为您进行低级解析。 github.com/FasterXML/jackson-dataformat-xml

标签: java xml xpath nodelist


【解决方案1】:

总结

您可以尝试以下表达式,它允许您选择节点而不关心命名空间ns0

/*[local-name()='GetADSLProfileResponse']/*[local-name()='Result']/*

说明

在您的语法中,有几个部分不正确。一起来看看吧。 XPath语法/xml表示文档的根节点是&lt;xml&gt;,但是根元素是&lt;ns0:GetADSLProfileResponse&gt;GetADSLProfileResponse 也不正确,因为您的 XML 文件包含命名空间。 Result 也一样:

/xml/GetADSLProfileResponse/Result

在我的解决方案中,我忽略了命名空间,因为您提供的命名空间不完整。这是一个完整的入门程序:

String XML =
  "<?xml version = \"1.0\" encoding = \"UTF-8\"?>\n"
      + "<ns0:GetADSLProfileResponse xmlns:ns0 = \"http://\">\n"
      + "  <ns0:Result>\n"
      + "    <ns0:eCode>0</ns0:eCode>\n"
      + "    <ns0:eDesc>Success</ns0:eDesc>\n"
      + "  </ns0:Result>\n"
      + "</ns0:GetADSLProfileResponse> ";
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document;
try (InputStream in = new ByteArrayInputStream(XML.getBytes(StandardCharsets.UTF_8))) {
  document = builder.parse(in);
}

XPath xPath = XPathFactory.newInstance().newXPath();
XPathExpression expr = xPath.compile("/*[local-name()='GetADSLProfileResponse']/*[local-name()='Result']/*");

NodeList nodeList = (NodeList) expr.evaluate(document, XPathConstants.NODESET);
for (int i = 0; i < nodeList.getLength(); i++) {
  Node node = nodeList.item(i);
  System.out.println(node.getNodeName() + ": " + node.getTextContent());
}

打印出来:

ns0:eCode: 0
ns0:eDesc: Success

另见:

【讨论】:

  • 我尝试了上面的答案,但是当我像这样迭代它时 for (int i = 0; i
  • @Bav,子节点eCodeeDesc 都是元素节点。使用方法 getNodeValue() 时,元素节点返回 null。您可以使用getTextContent()。请参阅 Javadoc docs.oracle.com/javase/8/docs/api/org/w3c/dom/Node.html
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-27
  • 2011-09-30
  • 2014-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-11
相关资源
最近更新 更多