XML解析

什么是XML

可扩展标记语言(Extensible Markup Language),标准通用标记语言的子集,简称XML。是一种用于标记电子文件使其具有结构性的标记语言。

XML的特点

  1. XML与操作系统、编程语言的开发平台无关
  2. 规范统一,实现不同系统之间的数据交换
    ps: XML技术应用广泛,最基本的如网站、应用程序的配置信息一般采用XML文件描述。现在XML常用与配置文件的使用。

XML文档结构

在这里插入图片描述

1 XML 的声明

<?xml version=”1.0” standalone=”yes” encoding=”UTF-8”>

这是一个XML处理指令。处理指令以 <? 开始,以 > 结束。<? 后的第一个单词是指令名,如xml, 代表XML声明。
version, standalone, encoding 是三个特性,特性是由等号分开的名称-数值对,等号左边是特性名称,等号右边是特性的值,用引号引起来。

几点解释:

version: 说明这个文档符合1.0规范
standalone: 说明文档在这一个文件里还是需要从外部导入, standalone 的值设为yes 说明所有的文档都在这一文件里完成
encoding: 指文档字符编码

2 XML 根元素定义

XML文档的树形结构要求必须有一个根元素。根元素的起始标记要放在所有其它元素起始标记之前,根元素的结束标记根放在其它所有元素的结束标记之后,如

<?xml version=”1.0” standalone=”yes” encoding=”UTF-8”?>
<Settings>
<Person>Zhang San</Person>
</Settings>

3 XML元素

元素的基本结构由 开始标记,数据内容,结束标记组成,如

<Person>
  <Name>Zhang San</Name>
  <Sex>Male</Sex>
</Person>

需要注意的是:

元素标记区分大小写,<Name> 与 <name>是两个不同的标记
结束标记必须有反斜杠,如 </Name>
XML元素标记命名规则如下:

  1. 名字中可以包含字母,数字及其它字母
  2. 名字不能以数字或下划线开头
  3. 名字不能用xml开头
  4. 名字中不能包含空格和冒号

4 XML中的注释

XML中注释如下:

<!-- this is comment -->

需要注意的是:

  1. 注释中不要出现“–”或“-”
  2. 注释不要放在标记中
  3. 注释不能嵌套

HTML和XML的区别

  1. 可扩展性方面:HTML不允许用户自行定义他们自己的标识或属性,而在XML中,用户能够根据需要自行定义新的标识及属性名,以便更好地从语义上修饰数据。 [6]
  2. 结构性方面:HTML不支持深层的结构描述,XML的文件结构嵌套可以复杂到任意程度,能表示面向对象的等级层次。 [6]
  3. 可校验性方面:HTML没有提供规范文件以支持应用软件对HTML文件进行结构校验,而XML文件可以包括一个语法描述,使应用程序可以对此文件进行结构校验。
特殊字符的处理
特殊字符实体名称
<&lt;
>&gt;
&&amp;
"&quot;
&apos;

规则

  1. 有XML声明语句
  2. 有且仅有一个根标签
  3. 标签大小写敏感
  4. 属性值用双引号包裹
  5. 标签成对/空标签关闭
  6. 元素正确嵌套

XML的解析方式有四种:

  • DOM解析
  • SAX解析
  • DOM4J解析
  • JDOM解析

ps:这里暂时只介绍DOM和DOM4J解析

DOM解析:

 //1.解析器工厂
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        //2.解析器
        DocumentBuilder builder = factory.newDocumentBuilder();
        //3.DOM对象
        Document document = builder.parse("phone.xml");
        //4.操作DOM对象
        //getElementsByTagName 获得指定标签名 标签信息
        //getLength 标签长度
        //item  第几个标签
        //getAttribute 获得指定属性名的属性值
        NodeList brand = document.getElementsByTagName("Brand");
        for (int i = 0; i < brand.getLength(); i++) {
            Element element = (Element) brand.item(i);
            String name = element.getAttribute("name");

            //遍历了子标签
            NodeList type = element.getElementsByTagName("Type");
            for (int j = 0; j < type.getLength(); j++) {
                Element element2 = (Element) type.item(j);
                String typeName = element2.getAttribute("name");
                System.out.println(name  + typeName);
            }
        }

这里只是获取节点信息,下面将介绍如何用DOM解析对XML进行增、删、改:

 //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","三星");
        Element type = document.createElement("Type");
        type.setAttribute("name","NoteX");
        //建立父子关系
        brand.appendChild(type);
        //建议整个文档的关系
        document.getElementsByTagName("PhoneInfo").item(0).appendChild(brand);

        //修改节点
        Element newBrand = (Element) document.getElementsByTagName("Brand").item(2);
        newBrand.setAttribute("name","SAMSUNG");
        Element newType = (Element) document.getElementsByTagName("Type").item(3);
        newType.setAttribute("name","T110");


        //删除节点
        NodeList del = document.getElementsByTagName("Brand");
        Element item = (Element) del.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");
        transformer.setOutputProperty(OutputKeys.STANDALONE,"yes");

        StreamResult result = new StreamResult(new FileOutputStream("src/cn/test4/DOM解析.xml"));
        transformer.transform(domSource,result);

DOM4J解析:

使用DOM4J解析时,需要导入DOM4j的jar包,代码如下:

  //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","T111");
        //修改
        brand.setAttributeValue("name","三星");
        type.setAttributeValue("name","666");
        //删除
        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();
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值