如何使用Java解析XML?

时间:2009-11-12 13:21:54

标签: java xml parsing

<?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个数据块,依此类推。请让我知道解决此问题的任何示例代码。

12 个答案:

答案 0 :(得分:11)

解析XML有两种基本方法。

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

答案 1 :(得分: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

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

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

请点击此处查看许多解析器的列表:http://java-source.net/open-source/xml-parsers

一个非常常用的库:

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

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

答案 4 :(得分:1)

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

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

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

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

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

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

答案 7 :(得分:0)

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

答案 8 :(得分:0)

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

答案 9 :(得分:0)

您可能想要使用JAXB

答案 10 :(得分:0)

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

答案 11 :(得分:0)

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

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