xml

1 概述

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

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

2 语法

2.1 组成

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

2.2 文档声明

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<</intro></stu>

dom4j

1 概述

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

2 使用

读取XML文档

@Test@SneakyThrowsvoid 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@SneakyThrowsvoid 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("hehe");}

写入xml

 @Test@SneakyThrowsvoid 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@SneakyThrowsvoid 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@SneakyThrowsvoid 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@SneakyThrowsvoid 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 元素。