Java 基础之读写XML

目录

一、XML基础知识

1、XML中的转义符

2、XML不解析标签

3、命名空间

​编辑

二、测试文件

三、使用Java标准库javax.xml读写XML

三、使用第三方DOM4J库读写XML

四、其他第三方库


一、XML基础知识

1、XML中的转义符

        在XML中,有五个预定义的实体引用(也称为转义符)用于表示特殊字符

(1) `&lt;` 表示小于符号 `<`.

(2)`&gt;` 表示大于符号 `>`.

(3)`&amp;` 表示和符号 `&`.

(4)`&quot;` 表示双引号 `"`

(5)`&apos;` 表示单引号 `'`

2、XML不解析标签

        如果您想在XML文档中包含标签,但不希望它们被解析为XML元素,您可以使用CDATA(Character Data)部分或者将标签中的特殊字符进行转义。

<![CDATA[  这里面可以是任何内容  ]]>

3、命名空间

        XML命名空间是一种用于在XML文档中避免元素和属性名称冲突的机制。它允许您在不同的XML文档或不同XML标记中使用相同的元素或属性名称,而不会引起混淆。XML命名空间通过在元素和属性名称前添加一个命名空间前缀来实现。

二、测试文件

<?xml version="1.0" encoding="UTF-8"?>

<root xmlns="http://www.yiqifu.top" xmlns:C="http://www.yiqifu.top/c" xmlns:D="http://www.yiqifu.top/d">  
  <Test>默认命名空间的元素值</Test>  
  <C:Test>C命名空间的元素值</C:Test>  
  <D:Test>D命名空间的元素值</D:Test>  
  <A:Test xmlns:A="http://www.yiqifu.top/a1"> A命名空间的元素值1</A:Test>  
  <A:Test xmlns:A="http://www.yiqifu.top/a2"> A命名空间的元素值2</A:Test>  
  <B:Test xmlns:B="http://www.yiqifu.top/b1"> B命名空间的元素值1</B:Test>  
  <B:Test xmlns:B="http://www.yiqifu.top/b2"> B命名空间的元素值2</B:Test>  
  <List id="1" type="列表1"> 
    <item id="1" name="元素1">元素1的描述</item>  
    <item id="2" name="元素2">元素2的描述</item> 
  </List>  
  <List id="2" type="列表2"> 
    <item id="1" name="元素1">元素1的描述</item>  
    <item id="2" name="元素2">元素2的描述</item> 
  </List>  
  <List id="99" type="列表3">
    <item name="元素1"/>
  </List>
</root>

三、使用Java标准库javax.xml读写XML

1、加载xml文件

    public static void main(String[] args) {
        String doc = "test.xml";
        Document document = TestLoad(doc);

        if(document!=null) {
            TestEdit(document);
            TestRead(document);
            TestSave(document, doc);
        }
    }
    
    public static Document TestLoad(String path){
        try {
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = null;
            builder = factory.newDocumentBuilder();
            Document document = builder.parse(path);
            return document;
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

2、读取xml文件数据


    public static void TestRead(Document document){
        NodeList nodeList =  document.getElementsByTagName("List");
        System.out.println(nodeList.getLength());
        for(int listIndex=0; listIndex<nodeList.getLength();listIndex++){
            Node node = nodeList.item(listIndex);
            Element element = (Element)node;
            String listType = element.getAttribute("type");
            System.out.println(listType);

            NodeList nodeItems = element.getChildNodes();
            for(int itemIndex=0; itemIndex<nodeItems.getLength();itemIndex++) {
                Node nodeItem = nodeItems.item(itemIndex);
                if(nodeItem.getNodeType() == Node.ELEMENT_NODE) {
                    Element elementItem = (Element) nodeItem;
                    String itemName = elementItem.getAttribute("name");
                    System.out.println("\t"+listType+" - "+itemName);
                }
            }
        }

//        element.getTagName();
    }

3、修改xml文件数据


    public static void TestEdit(Document document){
        NodeList nodeList =  document.getElementsByTagName("List");
        for(int listIndex=0; listIndex<nodeList.getLength();listIndex++) {
            Node node = nodeList.item(listIndex);
            Element element = (Element) node;
            String listId = element.getAttribute("id");
            if(listId == null || "".equals(listId)){
                element.setAttribute("id", (listIndex+1)+"");
            }
            else if("99".equals(listId) ){
                element.getParentNode().removeChild(element);
                listIndex--;
            }
        }
        Element elementList = document.createElement("List");
        elementList.setAttribute("id", "99");
        elementList.setAttribute("type", "列表3");

        Element elementItem = document.createElement("item");
        elementItem.setAttribute("name", "元素1");

        elementList.appendChild(elementItem);

        NodeList nodeRoot = document.getElementsByTagName("root");
        nodeRoot.item(0).appendChild(elementList);
    }

4、将修改保存到xml文件


    public static void TestSave(Document document, String path){
        try {
            TransformerFactory factory = TransformerFactory.newInstance();
            Transformer transformer = factory.newTransformer();
            //transformer.setOutputProperty(OutputKeys.ENCODING, "UTF8");
            transformer.setOutputProperty(OutputKeys.INDENT, "yes");
            transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");

            DOMSource source = new DOMSource(document);
            StreamResult result = new StreamResult(new File(path));
            transformer.transform(source, result);
        } catch (TransformerConfigurationException e) {
            e.printStackTrace();
        } catch (TransformerException e) {
            e.printStackTrace();
        }

    }

三、使用第三方DOM4J库读写XML

1、加载xml文件

    public static void main(String[] args) {
        String doc = "test.xml";
        Document document = TestLoad(doc);

        if(document!=null) {
            TestEdit(document);
            TestRead(document);
            TestSave(document, doc);
        }
    }

    public static Document TestLoad(String path){
        try {
            SAXReader saxReader = new SAXReader();
            Document document = saxReader.read(new File(path));
            return document;
        } catch (DocumentException e) {
            e.printStackTrace();
        }
        return null;
    }

2、读取xml文件数据


    public static void TestRead(Document document){
        Element root = document.getRootElement();
        for(Iterator iteratorList = root.elementIterator(); iteratorList.hasNext();){
            Object objList = iteratorList.next();
            if(!(objList instanceof Element)){
                continue;
            }
            Element element = (Element)objList;
            if(!"List".equals(element.getName())){
                continue;
            }
            String listType = element.attributeValue("type");
            System.out.println(listType);

            for(Iterator iteratorItem = element.elementIterator(); iteratorItem.hasNext();) {
                Object objItem = iteratorItem.next();
                if(!(objItem instanceof Element)){
                    continue;
                }
                Element elementItem = (Element)objItem;
                String itemName = elementItem.attributeValue("name");
                System.out.println("\t"+listType+" - "+itemName);

            }
        }

    }

3、修改xml文件数据


    public static void TestEdit(Document document){
        Element root = document.getRootElement();

        int index = 0;
        for(Iterator iteratorList = root.elementIterator(); iteratorList.hasNext();) {
            index++;
            Element element = (Element) iteratorList.next();
            if(!"List".equals(element.getName())){
                continue;
            }
            String listId = element.attributeValue("id");
            if(listId == null || "".equals(listId)){
                element.addAttribute("id", index+"");
            }
            else if("99".equals(listId) ){
                element.getParent().remove(element);
            }
        }


        Element elementList = root.addElement("List");
        elementList.addAttribute("id", "99");
        elementList.addAttribute("type", "列表3");

        Element elementItem = elementList.addElement("item");
        elementItem.addAttribute("name", "元素1");
    }

4、将修改保存到xml文件


    public static void TestSave(Document document, String path){
        try {
            OutputFormat format = OutputFormat.createPrettyPrint();
            //format.setEncoding("UTF8");
            XMLWriter writer = new XMLWriter(new FileWriter(path), format);
            writer.write(document);
            writer.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

四、其他第三方库

除前面介绍的两种方法外还很多库可以读写xml,例如JDOM 、JAXB、StAX。

1、JDOM (Java Document Object Model) 如DOM类型

         JDOM提供了一种方便的方式来表示和操作XML文档,类似于DOM,但更容易使用。它允许您构建、解析和操作XML文档树,以及进行查询和修改操作。

         参考地址:hunterhacker/jdom: Java manipulation of XML made easy (github.com)

2、JAXB (Java Architecture for XML Binding)  完成XML与对象映射

        JAXB用于将XML数据绑定到Java对象(反序列化)以及将Java对象序列化为XML数据。它主要用于在Java应用程序中映射XML数据到对象模型,以便进行简单的读取和写入。

参考地址:Lesson: Introduction to JAXB (The Java™ Tutorials > Java Architecture for XML Binding (JAXB)) (oracle.com)

3、StAX (Streaming API for XML)   大型XML处理

StAX提供了一种基于事件的流式XML处理方法,允许您以迭代方式处理XML文档,适用于大型文档或需要高性能的场景。

  

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

QIFU

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值