Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中的XML解析_Java_Xml - Fatal编程技术网

java中的XML解析

java中的XML解析,java,xml,Java,Xml,可能重复: 大家好 我是java初学者。我希望我问的问题可能很简单。我的问题是,如果我有一个XML文件,并且我想解析它,那么只需要使用in-specific标记获取元素。 例如,如果XML文件看起来像 <date>2005-10-31</date> <number>12345</number> <purchased-by> <name>My name</name> <address>

可能重复:

大家好

我是java初学者。我希望我问的问题可能很简单。我的问题是,如果我有一个XML文件,并且我想解析它,那么只需要使用in-specific标记获取元素。 例如,如果XML文件看起来像

<date>2005-10-31</date>
<number>12345</number>

<purchased-by>
    <name>My name</name>
    <address>My address</address>
</purchased-by>

    <order-items>

    <item>
        <code>687</code>
        <type>CD</type>
        <label>Some music</label>
    </item>

    <item>
        <code>129851</code>
        <type>DVD</type>
        <label>Some video</label>
    </item>

</order-items>

从这个XML中,我只想解析标记名order items中包含的元素

有什么通用的方法可以做到这一点吗?请让我知道。。
谢谢

这是SAX的经典案例。注册接收标记并忽略除订单项以外的所有标记的处理程序


也许更好的方法是使用Apache Digester,但对于您的特定任务来说,它已经太过死板了。

正如评论中所说,一个简短的谷歌搜索应该会让您达到目标。基本上,Java中有两种主要的XML解析方法:

  • ,在这里,您可以使用一个
  • ,它一直解析您的文件,并允许您以更像树的方式获取所有元素
另一个非常有用的XML解析方法是,尽管比这些方法要新一点,并且仅在Java6之后才包含在JRE中。StAX被认为是介于基于树的DOM方法和基于事件的SAX方法之间的中间方法。与SAX非常相似的是,解析非常大的文档非常容易,但在本例中,应用程序从解析器“提取”信息,而不是解析“推送”事件到应用程序。你可以找到关于这个问题的更多解释


因此,根据您想要实现的目标,您可以使用以下方法之一。

使用XPath。它允许您根据节点名称选择节点并加载其他条件。设置所涉及的代码很少


您可以使用DOM解析器来构建一个XML,然后使用
getElementsByTagName
方法提取所需的任何元素

以下是一些帮助您入门的示例代码:

    //parse file and build Document
    Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new File("file.xml"));

    //get list of elements called order-items
    NodeList orderItemsNodes = doc.getElementsByTagName("order-items");

    //iterate over the elements
    for(int i = 0 ; i <orderItemsNodes.getLength();i++ ){
        Node orderItemNode = orderItemsNodes.item(i);
    }
//解析文件和生成文档
Document doc=DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(新文件(“File.xml”);
//获取名为order items的元素列表
NodeList orderItemsNodes=doc.getElementsByTagName(“订单项”);
//迭代元素

对于(int i=0;i如果要将解析操作本身限制为
元素,则必须使用SAX。SAX解析器访问输入“文件”(或流)的所有元素您可以定义,解析器将忽略任何不是
或其子元素的内容。结果将是一个仅包含这些元素的
文档


如果xml文档非常小,并且性能不是限制因素,那么只需解析整个文档(这是一个2行程序)使用XPath表达式来选择正确的节点。

它实际上取决于你打算如何使用项目数据。如果你想把它解析成对象然后使用它,我会使用JAXB编组,但是如果你只想从每个项目元素的代码、类型和标签属性中剥离字符串值,你可以考虑使用。xml字符串上的简单正则表达式匹配-匹配每个项目标记的内容,然后匹配每个属性并提取其值。

如果您阅读了如何在Java中解析xml,尝试自己解决它,并在遇到问题时在此处发布一个问题(带有代码示例)。谷歌搜索.Agree@Marcelo Cantos这个问题在SO中也被问了很多次,所以你可以在这里搜索。这些人不是谷歌吗?我已经回答过很多类似的问题了。
XPath
要求你已经解析过(部分)文档。如果OP的措辞正确,他希望将解析操作限制在
。因此,在这种情况下,xpath不会有帮助。@Andreas\u D-我猜他的意思是他不关心其他元素,希望尽可能少的麻烦到达他感兴趣的元素。如果这是一个性能问题,您是对的。javax、 xml.xpath库不要求输入是DOM节点。当然,文档需要处理(与任何方法一样),但xpath实现不需要效率低下。StAX是xml解析的另一种标准方法。它与SAX类似,只是需要请求(拉)事件。Java SE 6中包含一个StAX游行。@Blaise:添加了一个关于StAXvtd xml的部分是另一个