java解析xml文件

  • Post author:
  • Post category:java


java解析xml常用的4种方法(这4种可以解决开发中遇到的xml解析的所有问题)



第一种 dom解析

<?xml version="1.0" encoding="GBK"?>
<address>
	<linkman>
		<name>Van_DarkHolme</name>
		<email>van_darkholme@163.com</email>
	</linkman>
	<linkman1>
		<name>Bili</name>
		<email>Bili@163.com</email>
	</linkman1>
</address>

public void readXml() throws Exception {
        //建立DocumentBuilderFactor,用于获得DocumentBuilder对象:
        DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
        //建立DocumentBuidler;
        DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
        //import org.w3c.dom.Document;
        Document document = documentBuilder.parse(new File("D:/1.xml"));
        NodeList node = document.getElementsByTagName("linkman");
        for (int i = 0; i < node.getLength(); i++) {
            Element e = (Element)node.item(i);
            String name = e.getElementsByTagName("name").item(0).getFirstChild().getNodeValue();
            String email = e.getElementsByTagName("email").item(0).getFirstChild().getNodeValue();
            System.out.println(name);
            System.out.println(email);
        }

结果:

Van_DarkHolme
van_darkholme@163.com

或者:

 @Test
    void contextLoads() throws ParserConfigurationException, IOException, SAXException {
        DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
        Document document  = documentBuilder.parse("F:\\testxml\\xmlText.xml");//注意路径不能包含中文,否则会报错
        NodeList node = document.getElementsByTagName("linkman");
        for (int i = 0; i < node.getLength(); i++) {
            Element e = (Element)node.item(i);
            String name = e.getElementsByTagName("name").item(0).getFirstChild().getNodeValue();
            String email = e.getElementsByTagName("email").item(0).getFirstChild().getNodeValue();
            System.out.println(name);
            System.out.println(email);
        }


    }



第二种 dom4j解析

<?xml version="1.0" encoding="UTF-8"?>
<books>
   <book id="001">
      <id>9</id>
      <title>Harry Potter</title>
      <author>J K. Rowling</author>
   </book>
   <book id="002">
      <title>Learning XML</title>
      <author>Erik T. Ray</author>
   </book>
   <book1 id="003">
      <title>Learning XML111</title>
      <author>Erik T. Ray111</author>
   </book1>
</books>

引入dom4j jar包

  <dependency>
        <groupId>org.dom4j</groupId>
        <artifactId>dom4j</artifactId>
        <version>2.1.3</version>
  </dependency>

 public void readXml() throws Exception{
       //1.创建Reader对象
        SAXReader saxReader = new SAXReader();
         //2.加载xml
        Document document = saxReader.read(new File("D:/1.xml"));
        //3.获取根节点
        Element rootElement = document.getRootElement();
        // rootElement.elements()获取根节点下所有的节点,
        List<Element> elements = rootElement.elements();
        //获取节点book1下属性为id的值 003
       rootElement.element("book1").attribute("id").getValue()for (Element element : elements) {
            //依次遍历根节点下的节点  book book book1
            element.getName();
            //依次遍历根节点下的节点对应属性为id的值 001 002 003
            System.out.println(element.attribute("id").getValue());
            System.out.println("----------------------------");
            //同样道理 继续依次获取该节点下的节点 
            List<Element> child = element.elements();
            for (Element element1 : child) {
                /依次/获取子节点  id title author   、title  author、title author  
                 element1.getName();
                 //依次获取子节点的值 9  Harry Potter  J K. Rowling、.......
                System.out.println(element1.getText());
            }
        }
        // 获取第二个节点book的属性为id的值 002
        elements.get(1).attribute("id").getValue();
        // 获取根节点下第二个节点book所有节点
        List<Element> elements1 = elements.get(1).elements();
        //获取根节点下第二个节点book节点下的第二个节点author的值 Erik T. Ray
         elements.get(1).elements().get(1).getText();
    }

结果:

在这里插入图片描述



第三种 XPath解析

<?xml version="1.0" encoding="UTF-8"?>
<books>
   <book id="001">
      <id>9</id>
      <title>Harry Potter</title>
      <author>J K. Rowling</author>
   </book>
   <book id="002">
      <title>Learning XML</title>
      <author>Erik T. Ray</author>
   </book>
   <book1 id="003">
      <title>Learning XML111</title>
      <author>Erik T. Ray111</author>
   </book1>
</books>

导入依赖

        <dependency>
            <groupId>org.dom4j</groupId>
            <artifactId>dom4j</artifactId>
            <version>2.1.3</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/jaxen/jaxen -->
        <dependency>
            <groupId>jaxen</groupId>
            <artifactId>jaxen</artifactId>
            <version>1.1.6</version>
        </dependency>
    @Test
    void c() throws DocumentException {
        //1.创建Reader对象
        SAXReader saxReader = new SAXReader();
        //2.加载xml
        Document document = saxReader.read(new File("F:\\testxml\\xmlText2.xml"));
        List<Node> node = document.selectNodes("//title");
        for (Node node1 : node) {
            System.out.println(node1.getText());
        }

        System.out.println("---------------------------------");
        Node n = document.selectSingleNode("//book[@id='001']//title");
        System.out.println(n.getName()+":"+n.getText());
    }

打印:

在这里插入图片描述

或者;

@Test
    void d() throws FileNotFoundException, DocumentException {
        FileInputStream inputStream = new FileInputStream("F:\\testxml\\xmlText2.xml");
        //1.创建Reader对象
        SAXReader saxReader = new SAXReader();
        //2.加载xml
        Document document = saxReader.read(inputStream);
        List<Node> node = document.selectNodes("//title");
        for (Node node1 : node) {
            System.out.println(node1.getText());
        }

        System.out.println("---------------------------------");
        Node n = document.selectSingleNode("//book[@id='001']//title");
        System.out.println(n.getName()+":"+n.getText());
    }



第四种 XPath解析网址请求返回的xml文件

接下来我们来解析一个可以查询手机号码相关信息的网址。

地址为(http://apis.juhe.cn/mobile/get?%20phone=16670002013&dtype=xml&key=9f3923e8f87f1ea50ed4ec8c39cc9253)

在这里插入图片描述

然后将解析这个网站将手机号码里面的内容解析出来。

在这里插入图片描述

    @Test
    void e() throws IOException, DocumentException {
        //1、获取到xml资源的输入流
        String phone = "16670002013";
        URL url = new URL("http://apis.juhe.cn/mobile/get?%20phone=" + phone + "&dtype=xml&key=9f3923e8f87f1ea50ed4ec8c39cc9253");
        //打开链接
        URLConnection conn = url.openConnection();
        //拿下网址的输入流
        InputStream is = conn.getInputStream();
        //2、创建一盒XML读取对象
        SAXReader sr = new SAXReader();
        //3、通过读取对象 读取xml数据吗,并返回文档对象
        Document doc = sr.read(is);
        //4.XPATH寻找地址
        Node node = doc.selectSingleNode("//company");
        System.out.println("号码附属公司:" + node.getText());
    }

打印:

在这里插入图片描述

提示:

  • 使用dom解析将xml树结构全部加载到内存中,保留了树结构,可以对树结构进行增删改 但是xml过大会导致内存溢出
  • dom4j的SAXread是一行一行的解析的,不会产生内存问题,但是不能进行增删改操作



版权声明:本文为weixin_49419695原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。