使用JAXP对XML文档进行DOM解析

一、XML解析方式分为两种:dom和sax

  • dom:(Document Object Model,即文档对象模型)是W3C组织推荐的解析XML的一种方式。
  • sax:(Simple API for XML)不是官方标准,但它是XML社区事实上的标准,几乎所有的XML解析器都支持它。

dom和sax解析方法的区别:

  • dom:对文档CRUD(增删改查)比较方便,缺点:占用内存比较大(将xml文件全部读入内存)。
  • sax:占用内存较少,解析速度快(从上往下读一行解析一行)。缺点:只适合读取,不适合CRUD。

XML解析开发包:Jaxp(sun)、Jdom、dom4j

今天学习Jaxp:

二、使用JAXP对XML文档进行DOM解析:

 

private static String filename="src/exam.xml"; 
    public static Document getDocument() throws Exception{
         //1创建工厂
        DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
        //2得到dom解析器对象
        DocumentBuilder builder=factory.newDocumentBuilder();
        //3解析xml文档,得到代表文档的document
        return builder.parse(filename);
        
    }

更加形象的描述为下图:

增,删,改 需要将更新后的内容在写到xml中

public static void writeXml(Document document) throws TransformerException{
        TransformerFactory factory=TransformerFactory.newInstance();
        Transformer tf=factory.newTransformer();
        //transform(Source xmlSource, Result outputTarget)
        tf.transform(new DOMSource(document), new StreamResult(filename) );
    }

三、实战演练:

books.xml

<?xml version="1.0" encoding="UTF-8" standalone="no"?><书架>
    <书>
         <书名 name="xxx">影响力</书名>
         <作者>罗伯特.西奥迪尼</作者>
     
     <售价>90</售价>
     </书>
         <书>
         <书名>JavaScript</书名>
         <作者>JS</作者>
         <售价>45</售价>
         </书>
</书架>

读取XML文件,JUnit测试:

@Test
    public  void read() throws ParserConfigurationException, SAXException, IOException {
        DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
        DocumentBuilder builder=factory.newDocumentBuilder();
        Document document=builder.parse("src/books.xml");
        NodeList list= document.getElementsByTagName("书名");
        Node node= list.item(0);
        String content=node.getTextContent();
        System.out.println(content);
    }

递归遍历XML文件中的所有节点

    @Test
    public  void read1() throws ParserConfigurationException, SAXException, IOException {
        DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
        DocumentBuilder builder=factory.newDocumentBuilder();
        Document document=builder.parse("src/books.xml");
        Node root=document.getElementsByTagName("书架").item(0);
        list(root);        
    }
    /*
     * 递归遍历XML文件中的所有节点
     * */
    public  void list(Node node){
        if(node instanceof Element){
        System.out.println(node.getNodeName());
        }
        NodeList childs= node.getChildNodes();
        for(int i=0;i<childs.getLength();i++){
            Node child=childs.item(i);
            list(child);
        }
    }

添加节点到XML文件中:

    @Test
    public  void add() throws ParserConfigurationException, SAXException, IOException, TransformerException{
        DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
        DocumentBuilder builder=factory.newDocumentBuilder();
        Document document=builder.parse("src/books.xml");
        Element price=document.createElement("售价");
        //创建节点
        //把创建的节点添加到第一本书
        price.setTextContent("90");
        Element book=(Element) document.getElementsByTagName("书").item(0);
        book.appendChild(price);
        //把更新后的文档
        TransformerFactory tfactory=TransformerFactory.newInstance();
        Transformer tf=tfactory.newTransformer();
        tf.transform(new DOMSource(document), new StreamResult("src/books.xml"));
    }

为标签添加属性:

    @Test
    public  void addAttr() throws ParserConfigurationException, SAXException, IOException, TransformerException{
        DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
        DocumentBuilder builder=factory.newDocumentBuilder();
        Document document=builder.parse("src/books.xml");
        Element bookname=(Element) document.getElementsByTagName("书名").item(0);
        bookname.setAttribute("name", "xxx");
        //把更新后的文档
        TransformerFactory tfactory=TransformerFactory.newInstance();
        Transformer tf=tfactory.newTransformer();
        tf.transform(new DOMSource(document), new StreamResult("src/books.xml"));
    }

删除操作:

@Test
    public  void delete() throws ParserConfigurationException, SAXException, IOException, TransformerException{
        DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
        DocumentBuilder builder=factory.newDocumentBuilder();
        Document document=builder.parse("src/books.xml");
        Element bookname=(Element) document.getElementsByTagName("售价").item(0);
        //把更新后的文档
        Element e=(Element) document.getElementsByTagName("书").item(0);
        e.removeChild(bookname);
        TransformerFactory tfactory=TransformerFactory.newInstance();
        Transformer tf=tfactory.newTransformer();
        tf.transform(new DOMSource(document), new StreamResult("src/books.xml"));
    }

快乐学习,轻松掌握!

 

转载于:https://www.cnblogs.com/lyjs/p/4858814.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Spring Boot中解析XML可以使用Java内置的DOM解析器或者使用第三方库如JAXB或JDOM。这里我将介绍如何使用DOM解析进行XML解析。 首先,你需要添加相关的依赖到你的项目中。在pom.xml文件中,添加以下依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>javax.xml.parsers</groupId> <artifactId>jaxp-api</artifactId> </dependency> ``` 接下来,我们创建一个XML解析的工具类。这个工具类可以使用DOM解析器来解析XML文件。 ```java import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import java.io.File; public class XmlParser { public void parseXml(String filePath) { try { File xmlFile = new File(filePath); DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document document = builder.parse(xmlFile); // 获取根元素 Element rootElement = document.getDocumentElement(); // 获取所有子元素 NodeList nodeList = rootElement.getChildNodes(); for (int i = 0; i < nodeList.getLength(); i++) { Node node = nodeList.item(i); if (node.getNodeType() == Node.ELEMENT_NODE) { Element element = (Element) node; // 根据标签名获取元素值 String value = element.getElementsByTagName("tag_name").item(0).getTextContent(); System.out.println(value); } } } catch (Exception e) { e.printStackTrace(); } } } ``` 在上面的代码中,我们通过DOM解析解析XML文件,并使用`getElementsByTagName`方法来获取指定标签的元素值。 最后,你可以在你的代码中实例化这个工具类,并调用`parseXml`方法来解析XML文件。 ```java public class Main { public static void main(String[] args) { XmlParser xmlParser = new XmlParser(); xmlParser.parseXml("path_to_xml_file"); } } ``` 请将`path_to_xml_file`替换为你实际的XML文件路径。这样你就可以使用DOM解析器来解析XML文件了。希望对你有所帮助!如果有其他问题,请继续提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值