xml总结

xml

1 概述

xml:即可扩展标记语言,xml是互联网数据传输的重要工具,它可以跨越互联网任何的平台,不受编程语言和操作系统的限制。

它允许用户自定义标签。一个标签用于描述一段数据;一个标签可以分为开始标签和结束标签,在开始标签和结束标签之间,又可以使用其他标签描述其他数据,以此来实现数据关系的描述。

2 语法

2.1 组成

一个XML文件分为如下几部分内容:
1.文档声明
2.元素
3.属性
4.注释
5.CDATA区、特殊字符
6.处理指令(processing instruction)

2.2 文档声明
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>

version –文档符合XML1.0规范,我们学习1.0
encoding –文档字符编码,比如”GB2312”或者”UTF-8”
standalone –文档定义是否独立使用
standalone=”no”为默认值。yes代表是独立使用,而no代表不是独立使用

2.3 元素

每个XML文档必须有且只有一个根元素

写法:

<!--包含内容-->
<a></a>
<!--不包含内容-->
<a/>
<!--下面两个元素意义不同-->
<stu>xiaoming</stu>
<stu>
    xiaoming
</stu>

命名规范:

  • 区分大小写;
  • 不能以数字或下划线”_”开头;
  • 元素内不能包含空格;
  • 称中间不能包含冒号(:)。

实体字符

实体字符 代替
< <
> >
& &
'
" "

CDATA

CDATA节中可以输入任意字符(除]]>外),但是不能嵌套!。

<stu id="001">
    <name>杨过</name> 
    <sex></sex>
    <age>20</age>
    <intro><![CDATA[ad<<&$^#*k]]></intro>
</stu>

dom4j

1 概述

DOM4J是 dom4j.org 出品的一个开源 XML 解析包。DOM4J应用于 Java 平台,采用了 Java 集合框架并完全支持 DOM,SAX 和 JAXP。

2 使用

读取XML文档

@Test
    @SneakyThrows
    void test1(){
        SAXReader saxReader = new SAXReader();
        // 读取xml
        // 注意:有多种方式读取
        Document document = saxReader.read("http://localhost:8080/1600914750685.xml");
        document = saxReader.read("e:/test/test.xml");
        // 获得xml字符串
        String asXML = document.asXML();
        System.out.println(asXML);
        // 获得根节点
        Element rootElement = document.getRootElement();
        // 新增节点及其数据
        Element menuElement = rootElement.addElement("menu");
        Element endNameElement = menuElement.addElement("endName");
        endNameElement.setText("make");
    }

document相关

   @Test
    @SneakyThrows
    void testx(){
        SAXReader saxReader = new SAXReader();
        // 读取xml
        // 注意:有多种方式读取
        // Document document = saxReader.read("http://localhost:8080/1600914750685.xml");
        Document document = saxReader.read("e:/test/test.xml");
        // 创建对象
         document = DocumentHelper.createDocument();
        // 解析文本获得对象
        document = DocumentHelper.parseText("<a>hehe</a>");
    }

写入xml

 @Test
    @SneakyThrows
    void test2(){
        SAXReader saxReader = new SAXReader();
        Document document = saxReader.read("e:/test/test.xml");
        FileOutputStream fo = new FileOutputStream("e:/test/test2.xml");
        OutputStreamWriter ow = new OutputStreamWriter(fo, "gbk");
        // 设置输出格式
        OutputFormat outputFormat = new OutputFormat();
        outputFormat.setEncoding("gbk");
        XMLWriter xmlWriter = new XMLWriter(ow,outputFormat);
        xmlWriter.write(document);
        xmlWriter.close();
    }

创建xml

    @Test
    @SneakyThrows
    void test3(){
        // 创建对象
        Document document = DocumentHelper.createDocument();
        Element rootElement = document.addElement("books"); // 建立跟节点
        rootElement.addComment("测试,这是跟"); // 增加注释
        Element book = rootElement.addElement("book"); // 增加子节点
        book.addAttribute("show","true"); // 增加属性
        book.setText("三国演义"); // 增加文本内容
        XMLWriter xmlWriter = new XMLWriter(new FileWriter(new File("e:/test/test3.xml")));
        xmlWriter.write(document);
        xmlWriter.close();
    }

属性操作

  @Test
    @SneakyThrows
    void testx(){
        SAXReader saxReader = new SAXReader();
        Document document = saxReader.read("e:/test/test.xml");
        Element rootElement = document.getRootElement();
        // 取得节点的属性
        Attribute attribute = rootElement.attribute("TradeCode");
        // 取得节点的属性值
        String tradeCode = rootElement.attributeValue("TradeCode");
        // 取得节点的所有属性
        Iterator<Attribute> attributeIterator = rootElement.attributeIterator();
        // 增加属性
        rootElement.addAttribute("id","222");
        // 删除属性
        rootElement.remove(attribute);
        // 修改属性
        List<Node> aNodeList = rootElement.selectNodes("CallNo/@id");
        for (Iterator<Node> it = aNodeList.iterator();((Iterator) it).hasNext();){
            Node node = it.next();
            node.setText("se");
        }
    }

节点操作

  @Test
    @SneakyThrows
    void test1(){
        SAXReader saxReader = new SAXReader();
        Document document = saxReader.read("e:/test/test.xml");
        // 获得xml字符串
        String asXML = document.asXML();
        System.out.println(asXML);
        // 获得根节点
        Element rootElement = document.getRootElement();
        // 新增节点及其数据
        Element menuElement = rootElement.addElement("menu");
        Element endNameElement = menuElement.addElement("endName");
        endNameElement.setText("make");
        // 迭代遍历所有节点
        Iterator<Element> elementIterator = rootElement.elementIterator();
        while (elementIterator.hasNext()){
            Element element = elementIterator.next();
            System.out.println(element.asXML());
        }
        // 修改节点内容
        List<Node> nodeList = rootElement.selectNodes("menu/book");
        Iterator<Node> iterator = nodeList.iterator();
        while (iterator.hasNext()) {
            Node node = iterator.next();
            node.setText("三国");
        }
        // 删除节点
        List<Node> nodes = rootElement.selectNodes("menu");
        Iterator<Node> iterator1 = nodes.iterator();
        while (iterator1.hasNext()) {
            Element element = (Element) iterator1.next();
            rootElement.remove(element);
        }
        // 取得单个节点
        Element callNoElement = rootElement.element("CallNo");
        rootElement.getText(); // 取得该节点下的文字
        String name = rootElement.elementText("CallNo"); // 取得下级节点CallNo的文字
        // 在该节点下添加CDATA内容
        rootElement.addCDATA("dsfnmfsdgfvosijfas");
    }

3 xpath

XPath 使用路径表达式在 XML 文档中选取节点,节点是沿着路径或者 step 来选取的。

基本

路径表达式 结果
bookstore 选取 bookstore 元素的所有子节点
/bookstore 选取根元素 bookstore
bookstore / book 选取bookstore 下名字为 book的所有子元素
//book 选取所有 book 子元素,而不管它们在文档中的位置。
bookstore//book 选取bookstore 下名字为 book的所有后代元素,而不管它们位于 bookstore 之下的什么位置。
//**@**lang 选取所有名为 lang 的属性。

未知节点

路径表达式 结果
/bookstore/* 选取 bookstore 元素的所有子节点
//* 选取文档中的所有元素
//title[@*] 选取所有带有属性的 title 元素。

谓语表达式

路径表达式 结果
/bookstore/book[1] 选取属于 bookstore 子元素的第一个 book 元素。
/bookstore/book[last()] 选取属于 bookstore 子元素的最后一个 book 元素。
/bookstore/book[last()-1] 选取属于 bookstore 子元素的倒数第二个 book 元素。
/bookstore/ book [position() < 3] 选取最前面的两个属于 bookstore 元素的子元素的 book 元素。
//title[@lang] 选取所有拥有名为 lang 的属性的 title 元素。
//title[@lang=‘eng’] 选取所有 title 元素,要求这些元素拥有值为 eng 的 lang 属性。
/bookstore/book[price>35.00] 选取所有 bookstore 元素的 book 元素,要求book元素的子元素 price 元素的值须大于 35.00。
/bookstore/book[price>35.00]/title 选取所有 bookstore 元素中的 book 元素的 title 元素,要求book元素的子元素 price 元素的值须大于 35.00

若干路径

路径表达式 结果
//book/title | //book/price 选取所有 book 元素的 title 和 price 元素。
//title | //price 选取所有文档中的 title 和 price 元素。
/bookstore/book/title**|**//price 选取所有属于 bookstore 元素的 book 元素的title 元素,以及文档中所有的 price 元素。

相关推荐

  1. xml总结

    2024-03-09 23:36:01       42 阅读
  2. XML要点总结

    2024-03-09 23:36:01       41 阅读
  3. spring基于xml的bean管理总结

    2024-03-09 23:36:01       61 阅读
  4. XML语法规则介绍及总结

    2024-03-09 23:36:01       36 阅读
  5. 【WPF】布局容器/面板总结XAML-Panel控件

    2024-03-09 23:36:01       62 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-09 23:36:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-09 23:36:01       100 阅读
  3. 在Django里面运行非项目文件

    2024-03-09 23:36:01       82 阅读
  4. Python语言-面向对象

    2024-03-09 23:36:01       91 阅读

热门阅读

  1. SQL 的优化手段

    2024-03-09 23:36:01       43 阅读
  2. 什么情况下导致索引失效

    2024-03-09 23:36:01       34 阅读
  3. Qt打开ROS工程文件

    2024-03-09 23:36:01       42 阅读
  4. 突破编程_C++_面试(单元测试)

    2024-03-09 23:36:01       45 阅读
  5. Python教程:Python在汽车软件中的应用(总线篇)

    2024-03-09 23:36:01       56 阅读
  6. python装饰器(Decorator)

    2024-03-09 23:36:01       42 阅读
  7. 自然语言处理之语言模型(LM)深度解析

    2024-03-09 23:36:01       61 阅读
  8. P5635 【CSGRound1】天下第一

    2024-03-09 23:36:01       39 阅读