java解析xml文件

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是一行一行的解析的,不会产生内存问题,但是不能进行增删改操作
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值