XML详解

1、XML概述
  • XML是可扩展标记语言(eXtensible Markup Language)的缩写,是一种数据表示格式,可以描述非常复杂的数据结果,如果XML内容存为文件,那么它就是一个XML文件
  • XML的内容经常被当成消息进行网络传输,或者作为配置文件用于存储系统信息
2、XML的创建
  • 创建一个XML类型的文件,要求文件的后缀必须使用xml,如hello_world.xml

IDEA创建XML文件

image-20231022092751823

3、XML语法规则
  • XML文件的后缀名为:xml

  • 文档声明必须是第一行

    <?xml version="1.0" encoding="utf-8" ?>
    
    • version:xml默认的版本号码,该属性是必须存在的

    • encoding:本xml文件的编码

  • XML的标签(元素)规则

    • 标签由一对尖括号和合法标识符组成,必须有且只有一个根标签

      <name></name>
      
    • 标签必须有开始就有结束

    • 特殊标签可以不成对,但必须有结束标识

      <br/>
      
    • 标签中可以定义属性,属性和标签名空格隔开,属性值必须用引号引起来

      <student id = "1"></name>
      
    • 标签需要正确的嵌套

      <student id = "1">
      	<name>张三</name>
      </student>
      
4、XML的其他组成
  • XML文件中可以定义注释信息

    <!--这是注释 -->
    
  • XML文件中可以存在以下特殊字符

    &lt;	< 	小于
    &gt;	>	大于
    &amp;	&	和号
    &apos;	'	单引号
    &quot;	"	双引号
    
5、XML文档约束方式

什么是文档约束?

文档约束就是用来限定xml文件中的标签及其属性该怎么写,以此强制约束程序员必须按照文档约束的规定来编写xml文件

文档约束的分类

  • DTD
  • schema
5.1、XML文档约束-DTD的使用

利用DTD文档约束,约束一个xml文件的编写

  1. 编写DTD约束文档,后缀必须是.dtd

    这里可以用英文哦,演示用中文

    <!ELEMENT 书架 (书+)>
    <!ELEMENT 书 (书名,作者,售价)>
    <!ELEMENT 书名 (#PCDATA)>
    <!ELEMENT 作者 (#PCDATA)>
    <!ELEMENT 售价 (#PCDATA)>
    
  2. 在需要编写的XML文件中导入该DTD约束文件

    <!DOCTYPE 书架 SYSTEM "data.dtd">
    
  3. 按照约束的规则编写XML文件内容

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE 书架 SYSTEM "data.dtd">
    <书架>
        <>
            <书名>web从入门到精通</书名>
            <作者>小林</作者>
            <售价>9.9</售价>
        </>
    </书架>
    

这里大家应该有意识到,dtd并不能约束数据的类型,所以还有第二种约束方式

5.2、XML文档约束-schema的使用

文档约束-schema

  • schema可以约束具体的数据类型,约束能力更强大
  • schema本身也是一个xml文件,本身也受到其他约束文件的要求,所以编写的更加严谨

image-20231022100859864

利用schema文档约束,约束一个xml文件的编写

  1. 编写schema约束文档,后缀必须是.xsd

    <?xml version="1.0" encoding="UTF-8" ?>
    <schema xmlns="http://www.w3.org/2001/XMLSchema"
            targetNamespace="http://www.itcast.cn"
            elementFormDefault="qualified">
        <element name="书架">
            <complexType>
                <sequence maxOccurs="unbounded">
                    <element name=''>
                        <complexType>
                            <sequence>
                                <element name='书名' type="string"></element>
                                <element name='作者' type="string"></element>
                                <element name='售价' type="double"></element>
                            </sequence>
                        </complexType>
                    </element>
                </sequence>
            </complexType>
        </element>
    </schema>
    
  2. 在编写的xml文件中导入schema约束文档

    <?xml version="1.0" encoding="utf-8" ?>
    <书架 xmlns="http://www.itcast.cn">
    </书架>
    
  3. 按照约束内容编写xml文件的标签

        <>
            <书名>web</书名>
            <作者>小林</作者>
            <售价>1.0</售价>
        </>
    
6、XML解析

什么是XML解析

  • 使用程序读取XML中的数据

两种解析方式

  • SAX解析
  • DOM解析(常用)
7、Dom解析

Dom常见的解析工具

名称说明
JAXPSUN公司提供的一套XML的解析API
JDOMJDOM是一个开源项目,它基于树型结构,利用纯JAVA的技术对XML文档实现解析、生产、序列化及多种操作
dom4j是JDOM的升级品,用来读取XML文件的,具有性能优异,功能强大和极其容易使用的特点,它的性能超过sun公司官方的dom技术,同时它是一个开放源代码的软件,HIbernate也是用它来读写配置文件
jsoup功能强大DOM方式的XML解析开发包,尤其对HTML解析更加方便

image-20231022103547221

7.1、使用Dom4j解析出XML文件

使用Dom4j解析出XML文件的数据进行解析

  1. 下载Dom4j框架,官网下载:dom4j
  2. 在项目中创建一个文件夹:lib
  3. 将dom4j-2.1.1.jar复制到lib文件夹中
  4. 在jar文件上点击,选择add as library
  5. 在类中导包使用

Dome4j解析XML-得到Document对象

  • SAXReader类

    构造器说明
    public SAXReader()创建Dom4j的解析器对象
    Document read(String url)加载XML文件成为Document对象
  • Document类

    方法名说明
    Element getRootElement()获取根元素对象

    使用Dom4j获取根元素

    public class demo01 {
        @Test
        public void parseXml() throws DocumentException {
            // 1、创建一个SAXReader解析对象:代表了Dom4j框架
            SAXReader saxReader = new SAXReader();
    
            //2、加载xml文件成为Document对象
            InputStream is = demo01.class.getResourceAsStream("/Contacts.xml");
            Document document = saxReader.read(is);
    
            // 3、文档对象获取根元素
            Element rootElement = document.getRootElement();
            System.out.println(rootElement.getName());
        }
    }
    
7.2、使用Dom4j解析XML的元素、属性、文本
方法名说明
List elements()得到当前元素下的所有子元素
List elements(String name)得到当前元素下指定名字的子元素返回集合
Elment element(String name)得到当前元素下指定名字的子元素,如果有很多名字相同的返回第一个
String getName()得到元素名字
String attributeValue(String name)通过属性名直接得到属性值
String elementText(子元素名)得到指定名称的子元素的文本
String getText()得到文本

代码演示

public class demo01 {
    @Test
    public void parseXml() throws DocumentException {
        // 1、创建一个SAXReader解析对象:代表了Dom4j框架
        SAXReader saxReader = new SAXReader();

        //2、加载xml文件成为Document对象
        InputStream is = demo01.class.getResourceAsStream("/Contacts.xml");
        Document document = saxReader.read(is);

        // 3、文档对象获取根元素
        Element rootElement = document.getRootElement();
        System.out.println(rootElement.getName());
    }

    @Test
    public void parseXMLAllNode() throws DocumentException {
        // 1、创建一个SAXReader解析对象:代表了Dom4j框架
        SAXReader saxReader = new SAXReader();

        //2、加载xml文件成为Document对象
        InputStream is = demo01.class.getResourceAsStream("/Contacts.xml");
        Document document = saxReader.read(is);

        //3、提取根元素对象
        Element rootElement = document.getRootElement();
        //4、提取根元素下的全部一级子元素
        List<Element> elements = rootElement.elements();
        for (Element element : elements) {
            System.out.println(element.getName());
            //5、获取属性值
            System.out.println(element.attributeValue("id"));

            //6、获取文本信息
            System.out.println(element.elementText("name"));

            //先得到元素对象,再取文本值
            Element name = element.element("name");
            System.out.println(name.getText());
            System.out.println(name.getTextTrim());
        }



    }
}

8、XPath技术

Xpath技术提供了简洁的方式进行XML信息的检索

  • Xpath使用路径表达式来定位XML文档中的元素节点或属性节点

使用Xpath检索出XML文件

  1. 导入(dom4j和jaxen-1.1.2.jar),Xpath技术依赖Dom4j技术
  2. 通过dom4j和SAXReader获取Document对象
  3. 利用Xpath提供的API,结合Xpath的语法完成选取XML文档元素节点进行解析操作
方法名说明
Node selectSingleNode(“表达式”)获取符合表达式的唯一元素
List selectNodes(“表达式”)获取符合表达式的元素集合

Xpath的四大检索方案

  • 绝对路径

    @Test
    public void parse01() throws DocumentException {
         SAXReader saxReader = new SAXReader();
         Document document = saxReader.read(XpathDemo.class.getResourceAsStream("/Contacts.xml"));
            //直接检索
         List<Node> nodes = document.selectNodes("/contactList/contact/name");
         for (Node node : nodes) {
             Element element = (Element) node;
             System.out.println(element.getTextTrim());
        }
    }
    
  • 相对路径

    @Test
    public void parse02() throws DocumentException {
        SAXReader saxReader = new SAXReader();
        Document document = saxReader.read(XpathDemo.class.getResourceAsStream("/Contacts.xml"));
        //先得到根元素
        Element rootElement = document.getRootElement();
        List<Node> nodes = rootElement.selectNodes("./contact/name");
        for (Node node : nodes) {
            Element element = (Element) node;
            System.out.println(element.getTextTrim());
        }
    }
    
  • 全文检索

        @Test
        public void parse03() throws DocumentException {
            SAXReader saxReader = new SAXReader();
            Document document = saxReader.read(XpathDemo.class.getResourceAsStream("/Contacts.xml"));
            /**
             * //元素             在全文找到这个元素
             * //元素1/元素2       在全文找元素1下面的全部元素2
             * //元素1//元素2
             */
    //        List<Node> nodes = document.selectNodes("//name");
    //        List<Node> nodes = document.selectNodes("//contact/name");
            List<Node> nodes = document.selectNodes("//contact//name");
            for (Node node : nodes) {
                Element element = (Element) node;
                System.out.println(element.getTextTrim());
            }
        }
    
  • 属性查找

    @Test
    public void parse04() throws DocumentException {
        SAXReader saxReader = new SAXReader();
        Document document = saxReader.read(XpathDemo.class.getResourceAsStream("/Contacts.xml"));
    
        //获取属性
        List<Node> nodes = document.selectNodes("//@id");
        for (Node node : nodes) {
            Attribute attribute = (Attribute) node;
            System.out.println(node.getName()+":"+attribute.getValue());
        }
    
        //检索元素,检索contace,带id属性
        List<Node> nodeList = document.selectNodes("//contact[@id]");
        for (Node node : nodeList) {
            Element element = (Element) node;
            System.out.println(element.elementTextTrim("name"));
        }
    
        //检索单个
        Node node = document.selectSingleNode("//contact[@id='1']");
        Element element = (Element) node;
        System.out.println(element.elementTextTrim("name"));
    }
    
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
你可以使用Qt的QtCore和QtXml模块来读写XML文件。下面是一个简单的示例代码,展示了如何使用Qt读取XML文件和写入XML文件: ```cpp #include <QtXml/QtXml> #include <QtCore/QFile> #include <QtCore/QIODevice> int main() { // 读取XML文件 QFile file("example.xml"); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { qDebug() << "Failed to open XML file for reading."; return -1; } QDomDocument doc; if (!doc.setContent(&file)) { qDebug() << "Failed to parse XML."; file.close(); return -1; } file.close(); // 遍历XML数据 QDomElement root = doc.documentElement(); QDomNodeList nodes = root.childNodes(); for (int i = 0; i < nodes.count(); i++) { QDomNode node = nodes.at(i); if (node.isElement()) { QDomElement element = node.toElement(); qDebug() << "Element name:" << element.tagName(); qDebug() << "Element value:" << element.text(); } } // 写入XML文件 QFile outputFile("output.xml"); if (!outputFile.open(QIODevice::WriteOnly)) { qDebug() << "Failed to open output XML file."; return -1; } QTextStream stream(&outputFile); doc.save(stream, 4); // 缩进为4个空格 outputFile.close(); return 0; } ``` 上述示例代码首先打开一个XML文件进行读取,然后使用`QDomDocument`类解析XML数据。通过遍历`QDomDocument`对象的子节点,可以获得每个元素的标签名和文本值。最后,将解析后的XML数据保存到新的XML文件中。 请注意,上述代码中使用的XML文件名为"example.xml"和"output.xml",你可以根据自己的需要修改这些文件名。此外,你需要在.pro文件中添加`QT += xml`以包含QtXml模块。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小林学习编程

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

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

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

打赏作者

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

抵扣说明:

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

余额充值