【问题标题】:How to get the sub part of xml file in java如何在java中获取xml文件的子部分
【发布时间】:2017-06-14 06:19:31
【问题描述】:

我有以下 xml 文件。

<?xml version="1.0" encoding="UTF-8"?>
<school>
    <student>
        <firstname name="ankush">
            <test>sample </test>  //......here can be more sub nodes

        </firstname>
        <lastname>thakur</lastname>
        <email>beingjavaguy.gmail.com</email>
        <phone>7678767656</phone>
        <address>
          <houseNo> </houseNo>
          <street> </street>
          <city> </city>
          <pincode> </pincode>
        </address>
    </student>
</school>

从上面的 xml 文件中,我想将节点作为字符串获取,如下所示

<address>
      <houseNo> </houseNo>
      <street> </street>
      <city> </city>
      <pincode> </pincode>
    </address>

上面的地址 xml 节点将被转换为 json 以在我的应用程序中使用。

我尝试过 DOM、SAX 解析器,但它们仅用于逐个节点获取每个节点,而不是 xml 文件的一部分。

由于我的 xml 文件有些大,我更喜欢使用 XMLStreamReader。

谁能告诉我,如何将 xml 文件的一部分作为字符串获取?

【问题讨论】:

  • 你的意思是你需要从大的xml文件中获取特定的父节点及其子节点????
  • 是的,@KishanCS
  • 请你澄清一下你认为它很大(以便更容易提出解决方案)
  • 我的意思是xml文件很大可能是MB的
  • 所以可能是 MB,而不是 20MB+

标签: java xml xmlstreamreader


【解决方案1】:

有很多工具可以简单地解析xml; JaxB、dom4j、jsoup……仅举几例。他们都有长处和短处。

在选择使用哪种技术时要考虑的重要一点是您现在实际需要什么以及您可能需要多大的灵活性。

所以为了给你吃东西,你需要访问每个学生的地址(我假设你的 xml 文件可能包含多个学生)。

您只需要地址还是需要更多? 你需要对地址做什么,你需要它在一个特定的结构中进行处理吗? 您在应用程序中是否有任何现有的 xml 处理? (我不喜欢介绍两种做同样事情的技术)

如果您只想查找字符串形式的数据,那么 Jsoup 或 Dom4j 是完美的(就像 Eritrean 编写的示例),但是如果您要求数据更多地采用 OO 结构,那么 JaxB 可能会有所帮助。

JaxB 基本上将 xml 转换为指定的 POJO 结构(使用 javax.xml.bind.annotation 注释进行注释),因此您的数据会自动很好地封装。

你可以使用:

javax.xml.parsers.DocumentBuilder builder = javax.xml.parsers.DocumentBuilderFactory.newInstance().newDocumentBuilder();
org.w3c.dom.Document xmlDocument = builder.parse(new InputSource(new StringReader(documentXml)));
org.w3c.dom.Node rootNode = xmlDocument.getFirstChild();
// then get by tag name

【讨论】:

  • 我们可以使用来自 Java API 的 XMLInputFactory 来做到这一点,因为我正在犹豫是否要再引入一个新库
  • 我喜欢不添加库的方法,除非您需要它们。我从未直接使用过 XMLInputFactory,目前我没有时间研究它。我会推荐使用 JaxB,因为我认为它是一个非常好的解决方案或 w3c 实现(原生于 java)
  • 我添加了一个java的w3c实现的例子。
【解决方案2】:

用 jsoup 试试。示例:

import java.io.File;
import java.io.IOException;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
// add
import org.jsoup.select.Elements;


public class JsoupTest {

    public static void main(String [] args) throws IOException{                  
        File input = new File("C:\\Users\\eritrean\\Desktop\\test.xml");
        Document doc = Jsoup.parse(input,"UTF-8");
        //select all address tags; returns a list of Elements
        Elements addresses = doc.getElementsByTag("address");
        for(Element address : addresses){
            System.out.println(address);
            System.out.println("------------");
        }
    }
}

【讨论】:

  • 您好@Eritrean,感谢您的回复,我想在xml文件中获取每个学生的地址字段。如何循环播放?
  • 我已经编辑了我的答案。首先通过标签名称获取所有“地址”元素并遍历列表。
猜你喜欢
  • 1970-01-01
  • 2015-10-02
  • 2011-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多