dom4j解析XML
一. 什么是XML
XML(e**X**tensible **M**arkup **L**anguage)
,是一种可扩展的标记语言,是一种用于标记电子文件使其具有结构性的标记语言。
XML技术是****W3C
****组织(World Wide Web Consortium万维网联盟)发布的,目前遵循的是W3C
组织于1998年2月10日发布的XML1.0
规范。
二. 示例
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE books SYSTEM "books.dtd">
<!--
<:<
>:>
&:&
-->
<books><!-- 根标签-头标签,不能有跟根标签平级的其他标签 -->
<book id="001" publish="四川出版社">
<name>《斗罗大陆》</name>
<price>199.00</price>
</book>
<book id="002">
<name>《斗破苍穹》</name>
<price>299.00&199.00</price>
</book>
<book id="003">
<name>《平凡的世界》</name>
<price>99.0 < money < 199.0</price>
<!--里面写特殊字符-->
<![CDATA[>&<><><><><>]]>
</book>
</books>
三. 语法
- <?xml version=*"1.0"* encoding=*"UTF-8"*?>
-
特殊字符
-
XML文档约束
-
dtd
约束:Document Type Definition文档类型定义,它使用一系列的合法元素来定义文档结构**。**使用ELEMENT关键字来声明一个XML元素 语法:<!ELEMENT 元素名称 使用规则> 文档类型声明以<!DOCTYPE开始,然后是根标签的名字。 使用规则: (#PCDATA):指示元素的主体内容只能是普通的文本. (Parsed Character Data) EMPTY:用于指示元素的主体为空。比如<br/> ANY:用于指示元素的主体内容为任意类型 (子元素):指示元素中包含的子元素 定义子元素及描述它们的关系: 如果子元素用逗号分开,说明必须按照声明顺序去编写XML文档。 如果子元素用“|”分开,说明任选其一。 用+、*、?来表示元素出现的次数 如果元素后面没有+*?:表示必须且只能出现一次 +:表示至少出现一次,一次或多次 *:任意次。表示可有可无,零次、一次或多次 ?:表示可以有也可以无,有的话只能有一次。零次或一次
-
对
books.xml
进行约束<!ELEMENT books (book+)> <!ELEMENT book (name,price)> <!ELEMENT name (#PCDATA)> <!ELEMENT price (#PCDATA)> <!ATTLIST book id> <!ATTLIST book publish>
-
schema约束
-
在上面的
dtd
约束中,我们发现,约束文件本身只是一个文本文件,在属性约束文件的时候,也是容易出现错误的,所以,这种约束存在较大的限制性。所以,需要另外一种更加强大的约束:schema约束。Schema的功能比dtd
更加强大,但是配置起来更加复杂!<?xml version="1.0" encoding="UTF-8" ?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://coderyech.cn" elementFormDefault="qualified"> <xs:element name="books"> <xs:complexType> <xs:sequence maxOccurs='unbounded'> <xs:element name="book"> <xs:complexType> <xs:sequence> <xs:element name='name' type='xs:string' /> <xs:element name='price' type='xs:double' /> </xs:sequence> <xs:attribute name="id" type="xs:long" use="required"/> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:schema>
-
-
四. DOM模型
- DOM:文档对象模型,将一个
XML(html)
文档的每一个****元素****解析成Java中的一个对象
D | Document | 文档(XML文档) : 磁盘上面的xml 文件 |
---|---|---|
O | Object | 对象(Java对象) : 把xml 文件中成员转换成Java对象 |
M | Model | 模型:xml 文件与Java中对象一一对应的关系 |
-
在Java使用了如下类型来描述上面的
xml
文档Node(节点) Element (元素) Attribute(属性) Text(文本)
五. DOM4J (Document Object Model for Java)
-
导入资源包,地址
-
准备一个xml文件,对其进行增删改查
<?xml version="1.0" encoding="UTF-8"?> <contacts> <linkman id="100"> <name>gg</name> <email>gg@coderyeah.com</email> <address>成都</address> <group>二仙桥</group> </linkman> <linkman id="200"> <name>mm</name> <email>lanyotech@qq.com</email> <address>成都</address> <group>成华大道</group> </linkman> <linkman id="500"> <name>coderyeah</name> <email>lanyotech@qq.com</email> <address>上海</address> <group>松江大学城</group> </linkman> <linkman id="600"> <name>莱昂纳多</name> <email>12@qq.com</email> <address>美国纽约</address> <group>好莱坞</group> </linkman> </contacts>
-
测试类
public class Dom4jTest { @Test public void testDel() throws Exception { final File file = new File("E:\\javabase\\practiceDemo\\src\\com\\lqs\\xmlTest\\dtd\\contacts.xml"); //删除最后一个linkman节点 SAXReader reader = new SAXReader(); final Document dom = reader.read(file); final Element root = dom.getRootElement(); final List<Element> elements = root.elements(); //获取集合最后一个节点 final Element element = elements.get(elements.size() - 1); //通过获取父节点删除自身节点 final boolean remove = element.getParent().remove(element); //将修改的dom写出文件去 XMLWriter writer = new XMLWriter(new FileWriter(file), OutputFormat.createPrettyPrint()); writer.write(dom); writer.close(); if (remove) { System.out.println("删除成功"); } } @Test public void testAdd() throws DocumentException, IOException { final File file = new File("E:\\javabase\\practiceDemo\\src\\com\\lqs\\xmlTest\\dtd\\contacts.xml"); //在根节点新增一个linkman节点 SAXReader saxReader = new SAXReader(); //获取dom对象 final Document dom = saxReader.read(file); final Element rootElement = dom.getRootElement();//得到根接点 //添加新节点 返回的是新添加节点 final Element element = rootElement.addElement("linkman"); //在新节点下添加其他节点 和属性 element.addAttribute("id", "600"); element.addElement("name").setText("莱昂纳多"); element.addElement("email").setText("12@qq.com"); element.addElement("address").setText("美国纽约"); element.addElement("group").setText("好莱坞"); //同步文本到文件 OutputFormat format = OutputFormat.createPrettyPrint();//格式化写入 更美观 // final OutputFormat format = OutputFormat.createCompactFormat();//使其不格式化 不美观 XMLWriter writer = new XMLWriter(new FileWriter(file), format); writer.write(dom); writer.close(); } @Test public void testUpdate() throws DocumentException, IOException { //修改linkman的id为500的name为coderyeah //1.创建对象 SAXReader reader = new SAXReader(); final File file = new File("E:\\javabase\\practiceDemo\\src\\com\\lqs\\xmlTest\\dtd\\contacts.xml"); //2.得到文本对象 final Document dom = reader.read(file); //3.获取根节点 final Element rootElement = dom.getRootElement(); //4.获取根节点下的所有子元素 final List<Element> elements = rootElement.elements(); //5.遍历集合 for (Element element : elements) { if ("500".equals(element.attributeValue("id"))) { //6.获取当前节点下的name节点 final Element name = element.element("name"); //7.给节点text重新赋值 name.setText("coderyeah"); //8.同步文本--把内存中的文本同步到文件中 //9.创建文本同步对象 XMLWriter writer = new XMLWriter(new FileWriter(file)); writer.write(dom);//写出文档 writer.close(); } } } @Test public void testQuery() throws DocumentException { SAXReader saxReader = new SAXReader(); //获取DOM文档对象 final Document document = saxReader.read(new File("E:\\javabase\\practiceDemo\\src\\com\\lqs\\xmlTest\\dtd\\contacts.xml")); //获取根节点 final Element rootElement = document.getRootElement(); System.out.println(rootElement); //获取根节点下所有linkman元素 final List<Element> elements = rootElement.elements(); System.out.println(elements.size());//3 //查询id为200的name值 for (Element element : elements) { //获取id值 // System.out.println(element.attribute("id")); final Attribute attribute = element.attribute("id"); // System.out.println(attribute.getValue());//得到所有id值 System.out.println("---------------------"); System.out.println(element.attributeValue("id"));//也可以得到所有id值 if ("500".equals(element.attributeValue("id"))) { System.out.println("d为200的name值=" + element.element("name").getText()); System.out.println("d为200的address值=" + element.element("address").getText()); System.out.println("d为200的group值=" + element.element("group").getText()); } } } @Test public void testOne() throws DocumentException { SAXReader saxReader = new SAXReader(); final Document document = saxReader.read(new File("E:\\javabase\\practiceDemo\\src\\com\\lqs\\xmlTest\\dtd\\contacts.xml")); System.out.println(document);//获取文档 } @Test public void selectTest() throws DocumentException { //建SaxReader对象 SAXReader reader = new SAXReader(); //读取待解析的xml文件 得到文档模型 final Document document = reader.read(new File("E:\\javabase\\practiceDemo\\src\\com\\lqs\\xmlTest\\books.xml")); //获取根节点 final Element rootElement = document.getRootElement(); System.out.println("根节点标签名:" + rootElement.getName());//books final Element element = rootElement.element("book"); System.out.println(element.attribute("id")); } }