java - 使用JAVA解析XML

标签 java parsing xml-parsing

我正在尝试解析 xml 文档的一些特定部分。我正在考虑从分析部分中提取数据,我需要警告、错误、通过,并且我需要进入每个部分 () 并获取结果和结果级别以及文本,例如在此“错误”中,我需要获取错误级别和文本“错误”。

<document>
    <configuration>
    </configuration>
    <data>
    </data>
    <analysis warnings="5" errors="3" information="0" passed="false">
        <files>
        </files>
        <results>
            <form>
                <section number="0">
                    <result level="error">ERROR</result>
                    <result level="error">ERROR</result>
                    <result level="error">ERROR</result>
                    <result level="warning">Warning</result>
                    <result level="warning">Warning</result>
                </section>
                <section number="1">
                    <result level="warning">WARNING</result>
                </section>
                <section number="2">
                    <result level="warning">WARNING</result>
                    <result level="warning">WARNING</result>
                </section>
            </form>
        </results>
    </analysis>
</document>

我有以下代码:

public void ProcessXMLFromPath(String path) throws Exception
    {
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();
        Document document =  builder.parse(path);
        NodeList nodeList = document.getDocumentElement().getChildNodes();

        for (int i = 0; i < nodeList.getLength(); i++) {
          Node node = nodeList.item(i);
          if (node instanceof Element) {
            System.out.println(node.getAttributes().toString());
            NodeList childNodes = node.getChildNodes();
            for (int j = 0; j < childNodes.getLength(); j++) {
              Node cNode = childNodes.item(j);

              if (cNode instanceof Element) {
                  System.out.println(cNode.getNodeName().toString()); 
                  if(cNode.getNodeName().toString() == "analysis")
                  {
                      String content = cNode.getLastChild().getTextContent().trim();
                      System.out.println(content);
                      //I thought this would print the children under the analysis section to the screen but I was mistaken. It does however make it to this point.
                  }
              }
            }

          }

        }
    }

我要打印到控制台的唯一内容是:

configuration
data
analysis

任何帮助将不胜感激!

最佳答案

代码的几个问题:

  1. cNode.getNodeName().toString() == "analysis",与 .equals 进行字符串比较
  2. analysisdocument 的直接后代(根据我们这里的 xml 片段),因此必须尽早对其进行检查。您的代码在 level 3 而不是 2 进行检查
  3. 您需要进一步深入分析以获得结果表单文本节点。

编辑: 根据评论,无需多次 for 循环的有效遍历方法是递归,如下所示:

public static void main(String[] args) throws ParserConfigurationException,
        SAXException, IOException {
    InputStream path = new FileInputStream("sample.xml");
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    DocumentBuilder builder = factory.newDocumentBuilder();
    Document document = builder.parse(path);
    traverse(document.getDocumentElement());

}

public static void traverse(Node node) {
    NodeList list = node.getChildNodes();
    for (int i = 0; i < list.getLength(); i++) {
        Node currentNode = list.item(i);
        traverse(currentNode);

    }

    if (node.getNodeName().equals("result")) {
        System.out.println("This -> " + node.getTextContent());
    }

}

结果如下:

This -> ERROR
This -> ERROR
This -> ERROR
This -> Warning
This -> Warning
This -> WARNING
This -> WARNING
This -> WARNING

关于java - 使用JAVA解析XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21488225/

相关文章:

iphone - 使用 GDataXML 在 Objective C 中更改 xml 中的属性值

Java调用同一父类的子构造函数

java - 枚举未提供预期结果

java - 解析具有可变键值对的字符串

javascript - 使用 Javascript 从 URL 解析 XML/RSS

未启用使用架构的 Java XML 解析验证

Java List<?> 设置方法

Java程序退出功能不起作用

java - 从pdf文件中提取文本

java - 使用java解析标记化的c代码