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
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Java 可以使用 Java API for XML Processing (JAXP) 中的 Validation API 对 XML 文件进行格式验证。具体实现步骤如下: 1. 创建一个 SAXParserFactory 实例,用于创建 SAXParser。 2. 设置 SAXParserFactory 的属性,使其支持 XML Schema 验证。 3. 创建一个 SAXParser 实例。 4. 实现一个 DefaultHandler,用于处理 SAX 事件。 5. 调用 SAXParser.parse() 方法,将 XML 文件解析为 SAX 事件流,并将 DefaultHandler 作为解析器的回调函数。 6. 如果 XML 文件格式不符合指定的 XML Schema,则会抛出 SAXException 异常。 下面是一个简单的示例代码,用于验证一个 XML 文件是否符合指定的 XML Schema: ```java import javax.xml.XMLConstants; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import javax.xml.validation.Schema; import javax.xml.validation.SchemaFactory; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class XmlValidator extends DefaultHandler { private boolean isValid = true; public boolean validate(String xmlFilePath, String xsdFilePath) { try { SAXParserFactory factory = SAXParserFactory.newInstance(); factory.setNamespaceAware(true); factory.setValidating(true); SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); Schema schema = schemaFactory.newSchema(new File(xsdFilePath)); factory.setSchema(schema); SAXParser parser = factory.newSAXParser(); parser.parse(new File(xmlFilePath), this); } catch (Exception e) { isValid = false; } return isValid; } @Override public void error(SAXParseException e) throws SAXException { isValid = false; } @Override public void fatalError(SAXParseException e) throws SAXException { isValid = false; } } ``` 在上述代码中,validate() 方法接受两个参数,分别是要验证的 XML 文件路径和 XML Schema 文件路径。如果 XML 文件符合指定的 XML Schema,将返回 true,否则返回 false。如果 XML 文件格式不符合指定的 XML Schema,将抛出 SAXException 异常,isValid 属性将被设置为 false。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

QIFU

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

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

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

打赏作者

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

抵扣说明:

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

余额充值