各种模式解析XML文档

本文介绍了XML的基本概念,强调其区别于HTML的主要在于传输数据而非显示数据。通过示例详细讲解了使用DOM解析XML的过程,包括获取节点信息和遍历节点。接着对比了DOM与Title模式解析XML的不同,并展示了DOMC模式下如何进行XML文档的添加、修改和删除操作。最后,通过DOM4J模式展示了XML节点的增删改操作。这些内容对于理解XML的处理和解析具有重要意义。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

XML

什么是XML

XML 指可扩展标记语言(EXtensible Markup Language)。
XML 是一种很像HTML的标记语言。
XML 的设计宗旨是传输数据,而不是显示数据。
XML 标签没有被预定义。您需要自行定义标签。
XML 被设计为具有自我描述性。
XML 是 W3C 的推荐标准。
每个XML文档必须要且仅有一个跟标签

XML和HTML的区别

XML 不是 HTML 的替代。
HTML 旨在显示信息,而 XML 旨在传输信息。
XML 和 HTML 为不同的目的而设计:
1.XML 被设计用来传输和存储数据。
2.HTML 被设计用来显示数据。

DOM模式解析XML

1.先创建一个xml文档
例如:

<?xml version="1.0" encoding="UTF-8" ?>
<PhoneInfo>
    <Brand name="华为">
        <Type name="P90"></Type>
    </Brand>
    <Brand name="苹果">
        <Type name="iPhone Z"></Type>
        <Type name="iPhone ZL"></Type>
    </Brand>
</PhoneInfo>

2.如何使用DOM解析XML

public class TestDOM {
    public static void main(String[] args) throws ParserConfigurationException, IOException, SAXException {
        //1.解析器工厂
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        //2.解析器
        DocumentBuilder builder = factory.newDocumentBuilder();
        //3.DOM对象
        Document document = builder.parse("src/cn/test2/phone.xml");
        //4.操作对象
        //getElementsByTagName 获得指定的标签名 标签信息
        NodeList barnd = document.getElementsByTagName("Brand");
        //getLength 标签长度
        for (int i = 0;i<barnd.getLength();i++){
            //item 第几个标签
            Element element = (Element) barnd.item(i);
            //getAttribute 获得指定属性名的属性值
            String name = element.getAttribute("name");
            NodeList types = element.getElementsByTagName("Type");
            //遍历子标签
            for(int j=0;j<types.getLength();j++){
                Element element1 = (Element) types.item(j);
                String type = element1.getAttribute("name");
                System.out.println("品牌 "+name+"  类型 " +type);
            }
        }
    }
}

运行结果

品牌 华为  类型 P90
品牌 苹果  类型 iPhone Z
品牌 苹果  类型 iPhone ZL

TITLE模式解析XML

1.创建一个xml文档

例如:

<?xml version="1.0" encoding="UTF-8" ?>
<PhoneInfo>
    <Brand name="华为">
        <Type name="P90">
            <Item>
                <title>标题信息</title>
                <link>连接</link>
                <description>描述</description>
                <pubDate>2020-01-18</pubDate>
            </Item>
        </Type>
    </Brand>
</PhoneInfo>

2.如何使用title解析XML

public class TestTitle {
    public static void main(String[] args) throws Exception {
        //1.解析器工厂
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        //2.解析器
        DocumentBuilder builder = factory.newDocumentBuilder();
        //3.DOM对象
        Document parse = builder.parse("src/cn/test3/title.xml");
        //4.操作DOM对象
        NodeList pubDate = parse.getElementsByTagName("pubDate");

        //方式一 getTextContent
        String textContent =pubDate.item(0).getTextContent();
        System.out.println("textContent = " + textContent);

        //方式二 getFirstChild getNodeValue
        String nodeValue = pubDate.item(0).getFirstChild().getNodeValue();
        System.out.println("nodeList = " + nodeValue);

    }
}

运行结果

textContent = 2020-01-18
nodeList = 2020-01-18

DOMC模式解析XML

1.创建一个xml文档

<?xml version="1.0" encoding="UTF-8" ?>
<PhoneInfo>
    <Brand name="华为">
        <Type name="P90"></Type>
    </Brand>
    <Brand name="苹果">
        <Type name="iPhone Z"></Type>
        <Type name="iPhone ZL"></Type>
    </Brand>
</PhoneInfo>

2.如何使用DOMC模式向xml文档中添加,修改,删除,节点
例如:

public class TestDOMCrud {
    public static void main(String[] args) throws Exception {
        //1.解析器工厂
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        //2.解析器
        DocumentBuilder builder = factory.newDocumentBuilder();
        //3.DOM对象
        Document document = builder.parse("src/cn/test4/phone.xml");
        //4.操作DOM对象
        Element brand = document.createElement("Brand");
        //增加节点
        brand.setAttribute("name", "sanxin");
        Element type = document.createElement("Type");
        type.setAttribute("name", "p20");
        brand.appendChild(type);
        document.getElementsByTagName("PhoneInfo").item(0).appendChild(brand);
        
        //修改节点
        Element brand1 = (Element) document.getElementsByTagName("Brand").item(2);
        brand1.setAttribute("name", "三星");
        Element type1 = (Element) document.getElementsByTagName("Type").item(3);
        type1.setAttribute("name", "P123");
        //删除节点
        NodeList brand2 = document.getElementsByTagName("Brand");
        Node item = brand2.item(2);
        item.getParentNode().removeChild(item);

        //保存 设置格式
        //DOM源
        DOMSource domSource =new DOMSource(document);
        //格式化工厂
        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        //格式化器
        Transformer transformer = transformerFactory.newTransformer();
        //具体格式
        transformer.setOutputProperty(OutputKeys.VERSION, "1.0");
        transformer.setOutputProperty(OutputKeys.ENCODING, "utf-8");
        transformer.setOutputProperty(OutputKeys.INDENT, "yes");
        StreamResult result = new StreamResult(new FileOutputStream("src/cn/test4/phone1.xml"));
        transformer.transform(domSource, result);
    }
}

添加节点示例运行结果

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<PhoneInfo>
    <Brand name="华为">
        <Type name="P90"/>
    </Brand>
    <Brand name="苹果">
        <Type name="iPhone Z"/>
        <Type name="iPhone ZL"/>
    </Brand>
<Brand name="sanxin">
<Type name="p20"/>
</Brand>
</PhoneInfo>

修改节点示例运行结果

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<PhoneInfo>
    <Brand name="华为">
        <Type name="P90"/>
    </Brand>
    <Brand name="苹果">
        <Type name="iPhone Z"/>
        <Type name="iPhone ZL"/>
    </Brand>
<Brand name="三星">
<Type name="P123"/>
</Brand>
</PhoneInfo>

删除节点示例运行结果

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<PhoneInfo>
    <Brand name="华为">
        <Type name="P90"/>
    </Brand>
    <Brand name="苹果">
        <Type name="iPhone Z"/>
        <Type name="iPhone ZL"/>
    </Brand>
</PhoneInfo>

DOM4J模式解析XML
注意:需要先下载dom4j的jar包,在
https://dom4j.github.io下载后将相应的jar包加入工程就可以使用了。

1.创建一个xml文档
例如:

<?xml version="1.0" encoding="UTF-8" ?>
<PhoneInfo>
    <Brand name="华为">
        <Type name="P90"></Type>
    </Brand>
    <Brand name="苹果">
        <Type name="iPhone Z"></Type>
        <Type name="iPhone ZL"></Type>
    </Brand>
</PhoneInfo>

2.如何使用dom4j模式向xml文档中添加,修改,删除节点

public class TestDOM4J {
    public static void main(String[] args) throws IOException, Exception {
        //1.SAXReader
        SAXReader saxReader = new SAXReader();
        //2.DOM对象
        Document document = saxReader.read("src/cn/test5/phone.xml");
        System.out.println("document.asXMl() = " + document.asXML());
        //3.根标签
        Element rootElement = document.getRootElement();
        //4.操作根标签

        //增加
        Element brand = rootElement.addElement("Brand");
        brand.setAttributeValue("name", "SAMSUNG");
        Element type = rootElement.addElement("Type");
        type.setAttributeValue("name", "T123");
        //修改
        brand.setAttributeValue("name", "三星");
        type.setAttributeValue("name", "T321");
        //删除
        rootElement.remove(brand);
        rootElement.remove(type);
        //保存
        //格式
        OutputFormat format = OutputFormat.createPrettyPrint();
        format.setEncoding("UTF-8");
        XMLWriter writer= new XMLWriter(new FileWriter("src/cn/test5/DOM4j解析.xml"),format);
        writer.write(document);
        writer.close();

    }
}

添加节点运行结果

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

<PhoneInfo> 
  <Brand name="华为"> 
    <Type name="P90"/> 
  </Brand>  
  <Brand name="苹果"> 
    <Type name="iPhone Z"/>  
    <Type name="iPhone ZL"/> 
  </Brand>  
  <Brand name="SAMSUNG"/>
  <Type name="T123"/>
</PhoneInfo>

修改节点运行结果

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

<PhoneInfo> 
  <Brand name="华为"> 
    <Type name="P90"/> 
  </Brand>  
  <Brand name="苹果"> 
    <Type name="iPhone Z"/>  
    <Type name="iPhone ZL"/> 
  </Brand>  
  <Brand name="三星"/>
  <Type name="T321"/>
</PhoneInfo>

删除节点运行结果

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

<PhoneInfo> 
  <Brand name="华为"> 
    <Type name="P90"/> 
  </Brand>  
  <Brand name="苹果"> 
    <Type name="iPhone Z"/>  
    <Type name="iPhone ZL"/> 
  </Brand> 
</PhoneInfo>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值