【问题标题】:How can I parse XML using Java?如何使用 Java 解析 XML?
【发布时间】:2010-12-15 21:08:42
【问题描述】:
<?xml version="1.0" ?> 
<input>
    <sys>
      <protocol>TL1</protocol> 
      <ipAddress>10.05.2.3</ipAddress>
      <port>2001</port>
      <prompt>agent</prompt>       
       <TL1Command>
           <type>get</type>
           <command_code>...........</command_code>
           <staging_block>      
                <tid>...........</tid>
                <aid>...........</aid>
                <ctag>..........</ctag>
                <gen_block>.....</gen_block>
           </staging_block>
           <payload_block>
                <data_block>.......</data_block>
           </payload_block>
    </TL1Command>
    </sys>
    <sys>
      <protocol>TL1</protocol> 
      <ipAddress>10.5.2.98</ipAddress>
      <port>2001</port>
      <prompt>agent</prompt>       
       <TL1Command>
           <type>get</type>
           <command_code>...........</command_code>
           <staging_block>      
                <tid>...........</tid>
                <aid>...........</aid>
                <ctag>..........</ctag>
                <gen_block>.....</gen_block>
           </staging_block>
           <payload_block>
                <data_block>.......</data_block>
                <data_block>.......</data_block>
                <data_block>.......</data_block>
           </payload_block>
    </TL1Command>
    </sys>
</input>

我想知道如何使用 Java 解析这个 XML。这样我就可以以与我的程序相同的给定方式使用该数据。我知道如何解析它,但问题是每个命令可能有不同数量的数据块。所以解析后我需要为各自的命令使用各自的数据块。我的意思是,对于第一个命令,我应该只获得一个数据块值,而对于第二个命令,我应该得到 3 个数据块,依此类推。请让我知道解决此问题的任何示例代码。

【问题讨论】:

  • 你尝试过哪些解析器?而且我不明白您是如何尝试使用这些数据的
  • 我真的很喜欢 JIBX (jibx.sourceforge.net),感谢 stackoverflow.com :)

标签: java xml parsing


【解决方案1】:

解析 XML 有两种基本方法。

  1. 基于游标 (StAX) 或事件 (SAX) 的方法。更轻量级但通常更冗长。当您只想抓取小零件或加工容易时,这特别好;和
  2. 基于树的方法 (DOM)。无论如何,通常 DOM 解析器都构建在 SAX/StAX 解析器之上。它们需要更多的处理,并且通常要求您在执行任何操作之前将整个文档保存在内存中(而 SAX/StAX 可以更有效且响应更快)。但这对于“随机”访问文档部分很有用。

选择最适合您情况的。

【讨论】:

    【解决方案2】:

    最简单的方法是将文档加载为 DOM 文档

    然后使用 XPath 得到你需要的东西

    Document document =  DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(inputStream);
    
    NodeList nodeList = XPathAPI.selectNodeList(document, "/sys");
    for (int i = 0; i < nodeList.getLength(); i++) {
        Node node = nodeList.item(i);
        System.out.println(node.getTextContent());
    }
    

    查看 xpath 教程here

    【讨论】:

      【解决方案3】:

      您可以考虑 Xpath(它属于本主题中cletus 列出的“基于树的方法”)。如果您只想从 xml 文档中获取 ,这是最方便/最简单的方法。

      这里有一些有用的 Xpath 教程:
      学习语法:http://www.w3schools.com/Xpath/
      学习如何在 Java 中使用:http://www.ibm.com/developerworks/library/x-javaxpathapi.html

      【讨论】:

        【解决方案4】:

        您是否只是在寻找一个允许您将 xml 读入对象图的库?

        请参阅此处以获取许多解析器的列表:http://java-source.net/open-source/xml-parsers

        一个很常用的库:

        dom4j:http://www.dom4j.org/

        另一个 SO 问题:Fastest XML parser for small, simple documents in Java

        【讨论】:

          【解决方案5】:

          使用 DOM(文档对象模型)解析器或 SAX(XML 的简单 API)解析器来解析您的 xml 文档。 首先创建一个xml文档。 (扩展名为 .xml 的文件) 从链接http://archive.apache.org/dist/xml/xerces-j/下载解析器 并解析您的文档

          【讨论】:

            【解决方案6】:

            正如 cletus 所描述的,您必须在基于事件的方法或必须遍历的 DOM 树之间做出选择。将基于事件的场景视为某种状态机,当您输入元素“payload_block”时,您设置相应的属性,只要设置了它并且来自“data_block”的事件进入,您就可以读取它们随着来自 playload_block 的关闭事件的到来。

            当您遍历树时,您将读取“payload_block”的子项,并期待一个您可以迭代并收集数据的列表。

            【讨论】:

              【解决方案7】:

              很难说出实际问题。为简单起见,我将构建一个 DOM 树并从该结构中读取数据。

              TL1Command 的典型类可能如下所示:

              class TL1Command {
                String type;
                String commandLine;
                StagingBlock stagingBlock;
                List<DataBlock> dataBlocks;
              }
              

              这种结构足够灵活,可以在每个 TL1Command 中处理不同数量的数据块。 (是这个问题吗?)

              【讨论】:

                【解决方案8】:

                当您非常了解文件的结构时,我真的很喜欢(这只是我的观点)SAX 方法。这是一个可以帮助您的链接SAX2 Tutorial

                【讨论】:

                  【解决方案9】:

                  如果您只需要将 XML sn-ps 放入/取出对象图,那么您可以考虑XStream,它是一个简单的轻量级编组/解组库。

                  【讨论】:

                    【解决方案10】:

                    您可能想使用JAXB

                    【讨论】:

                      【解决方案11】:

                      您可能还想知道vtd-xml,另一个开源 XML 解析/索引库 ...

                      【讨论】:

                        【解决方案12】:

                        正是出于这个原因,我编写了一个非常简单的 API。它使用底层的 DOM 解析器,但公开了一个非常简单易用的 API,使您可以非常轻松地获取 XML 数据。它只是一个可以在代码中用作库的 Java 文件。希望对您有所帮助。

                        http://argonrain.wordpress.com/2009/10/27/000/

                        【讨论】:

                          猜你喜欢
                          • 2019-03-24
                          • 2015-07-02
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 2014-06-15
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          相关资源
                          最近更新 更多