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 元素。 |