<?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个数据块,依此类推。请让我知道解决此问题的任何示例代码。
答案 0 :(得分:11)
解析XML有两种基本方法。
选择最适合您情况的那个。
答案 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文件,您可以在代码中用作库。希望有所帮助。