XML&DOM解析XML

目录

XML

XML(EXtensible Markup Language)

特点

作用

XML标签

XML转义符列表

XML编写注意事项

DOM解析XML

DOM介绍

常用API


XML

XML(EXtensible Markup Language)

  • 可扩展标记语言

特点

  • XML与操作系统、编程语言的开发平台无关
  • 实现不同系统之间的数据交换

作用

  • 数据交互
  • 配置应用程序和网站
  • Ajax基石

XML标签

XML文档内容由一系列标签元素组成

<元素名 属性名=“属性值”>元素内容</元素名>

  • 属性值用引号包裹
  • 一个元素可以有多个属性
  • 属性值中不能直接包含<、&
  • 不建议使用的字符:“、‘、>

XML转义符列表

符号转义符
<

&lt;

>&gt;
"

&quot;

'&apos;
&&amp;
空格&#160;

XML编写注意事项

  1. 所有XML元素都必须有结束标签
  2. XML标签对大小写敏感
  3. XML必须正确的嵌套
  4. 同级标签以缩进对齐
  5. 元素名称可以包含字母、数字或其他的字符
  6. 元素名称不能以数字或者标点符号开始
  7. 元素名称中不能含空格
<?xml version="1.0" encoding="UTF-8" ?>
<books>
    <book id="NO1">
        <title>格林童话</title>
        <author>格林</author>
        <price>价格:20.00</price>
    </book>
    <book>
        <title>安徒生童话</title>
        <author>安徒生</author>
        <price>价格:19.9</price>
    </book>
</books>

 

<?xml version="1.0" encoding="UTF-8" ?>
<!--
衣服型号	对应身高
      S   	身高<165
      M	    165<身高<170
      L	    170<身高<175
      XL	175<身高<180
      XXL	180<身高<185
      -->
<closeSize>
    <size range="&#160;height&#160;&lt;&#160;165&#160;">S</size>
    <size range="&#160;165&#160;&lt;&#160;height&#160;&lt;&#160;170&#160;">M</size>
    <size range="&#160;170&#160;&lt;&#160;height&#160;&lt;&#160;175&#160;">L</size>
    <size range="&#160;175&#160;&lt;&#160;height&#160;&lt;&#160;180&#160;">XL</size>
    <size range="&#160;180&#160;&lt;&#160;height&#160;&lt;&#160;185&#160;">XXL</size>
</closeSize>

结果:

DOM解析XML

DOM介绍

  • 文档对象模型(Document Object Model)
  • DOM把XML文档映射成一个倒挂的树

常用API

DOM解析包:org.w3c.dom

常用接口

常用方法

说明

Document:表示整个 XML 文档NodeList getElementsByTagName(String Tag)按文档顺序返回文档中指定标记名称的所有元素集合
Element createElement(String tagName)创建指定标记名称的元素
Node:该文档树中的单个节点NodeList getChildNodes()获取该元素的所有子节点,返回节点集合
Element:XML 文档中的一个元素String getTagName()获取元素名称
/**
收藏信息.xml
*/
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<PhoneInfo>
    <Brand name="华为">
        <Type name="Mate30 Pro"/>
        <Type name="P30 Pro"/>
        <Type name="nova 6"/>
    </Brand>
    <Brand name="苹果">
        <Type name="iPhone11 Pro"/>
    </Brand>
</PhoneInfo>
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import java.io.File;
import java.io.IOException;

public class ParseXMLDmo {
    Document document = null;

    public static void main(String[] args) {
        ParseXMLDmo parseXMLDmo = new ParseXMLDmo();
        parseXMLDmo.getDocument();
//        System.out.println(parseXMLDmo.document);
        parseXMLDmo.showInfo();
        parseXMLDmo.addNode();
    }

    private void addNode() {
        Element brand = document.createElement("Brand");
        brand.setAttribute("name","小米");

        Element type = document.createElement("Type");
        type.setAttribute("name","小米6");
        brand.appendChild(type);
        document.getElementsByTagName("PhoneInfo").item(0).appendChild(brand);
        this.saveXML("src/main/java/XML/收藏.xml");
    }

    private void saveXML(String path) {
        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        try {
            Transformer transformer = transformerFactory.newTransformer();
            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();
        }
    }

    private void showInfo() {
        //NodeList getElementsByTagName(String Tag)	按文档顺序返回文档中指定标记名称的所有元素集合
        NodeList nodeList = document.getElementsByTagName("Brand");
        for (int i = 0; i < nodeList.getLength(); i++) {
            Node node = nodeList.item(i);
            Element node1 = (Element) node;
            String name = node1.getAttribute("name");
            System.out.println(name);

            //NodeList getChildNodes()	获取该元素的所有子节点,返回节点集合
            NodeList childNodes = node1.getChildNodes();
            for (int j = 0; j < childNodes.getLength(); j++) {
                Node node2 = childNodes.item(j);
                if (node2.getNodeType() == Node.ELEMENT_NODE) {
                    Element node21 = (Element) node2;
                    String name1 = node21.getAttribute("name");
                    System.out.println(name1);
                }
            }
        }
    }

    public void getDocument() {
        try {
            DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
            document = documentBuilder.parse("src/main/java/XML/收藏信息.xml");
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        }
    }
}

输出结果:输出信息在一个新的xml文件中

/**
收藏.xml
*/
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<PhoneInfo>
    <Brand name="华为">
        <Type name="Mate30 Pro"/>
        <Type name="P30 Pro"/>
        <Type name="nova 6"/>
    </Brand>
    <Brand name="苹果">
        <Type name="iPhone11 Pro"/>
    </Brand>
    <Brand name="小米">
        <Type name="小米6"/>
    </Brand>
</PhoneInfo>

控制台输出收藏信息.xml文件中的信息

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值