xml
1 概述
xml:即可扩展标记语言,xml是互联网数据传输的重要工具,它可以跨越互联网任何的平台,不受编程语言和操作系统的限制。
它允许用户自定义标签。一个标签用于描述一段数据;一个标签可以分为开始标签和结束标签,在开始标签和结束标签之间,又可以使用其他标签描述其他数据,以此来实现数据关系的描述。
2 语法
2.1 组成
一个XML文件分为如下几部分内容:
1.文档声明
2.元素
3.属性
4.注释
5.CDATA区、特殊字符
6.处理指令(processing instruction)
2.2 文档声明
xml
<?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文档必须有且只有一个根元素
写法:
xml
<!--包含内容-->
<a></a>
<!--不包含内容-->
<a/>
<!--下面两个元素意义不同-->
<stu>xiaoming</stu>
<stu>
xiaoming
</stu>
命名规范:
- 区分大小写;
- 不能以数字或下划线"_"开头;
- 元素内不能包含空格;
- 称中间不能包含冒号(:)。
实体字符
实体字符 | 代替 |
---|---|
< | < |
> | > |
& | & |
' | ' |
" | " |
CDATA
CDATA节中可以输入任意字符(除]]>
外),但是不能嵌套!。
xml
<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文档
java
@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相关
java
@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
java
@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
java
@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();
}
属性操作
java
@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");
}
}
节点操作
java
@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 元素。 |