2009-11-12 63 views
2
<?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个数据块等。请让我知道解决此问题的任何示例代码。如何使用Java解析XML?

+0

您尝试了哪些解析器?我不明白你是如何使用数据的 – Mark 2009-11-12 13:25:10

+0

我真的很喜欢JIBX(http://jibx.sourceforge.net/),这要感谢stackoverflow.com :) – Trick 2009-11-12 17:25:25

回答

11

有来解析XML两种基本方法。

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

选择哪种是最适合你的情况。

+1

另一个开源的xml解析器是vtd-xml,这被认为比DOM,SAX和Pull更高级一些 – 2009-11-23 02:32:05

0

正如克莱描述,你有基于事件的方法或之间进行选择DOM树必须遍历。考虑基于事件的场景作为某种状态机,当你输入元素“payload_block”时,你设置了一个相应的属性,只要它被设置并且来自“data_block”的事件进来,你就会读它们很长时间作为来自playload_block的关闭事件。

当你遍历树,you'll读“payload_block”的孩子,希望你可以遍历并收集数据的列表。

0

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

为TL1Command一个典型的类,然后可能看起来像:

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

这种结构具有足够的灵活性来处理每个TL1Command数据块个数不同。 (是,这个问题?)

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

0

我真的很喜欢(和它只是我的意见)的SAX方法,当你知道你的良好的files.Here结构是一个链接,可以帮助您SAX2 Tutorial

0

如果你只需要得到XML代码片段进出对象图,那么你可能会考虑XStream这是一个简单的轻量级编组/解编库。

0

你可能也想知道vtd-xml,另一个开源XML解析/索引LIB ...

1

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

0

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

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