Dom解析
Dom解析是将xml文件全部载入,组装成一颗dom树,然后通过节点以及节点之间的关系来解析xml文件。本文将先建立xml文件,然后通过dom解析器对xml文件进行解析,最后通过JUnit进行代码测试。
建立xml文件
建立xml约束文件(dtd)文件
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT 书架 (书+)>
<!ELEMENT 书 (书名, 作者, 售价)>
<!ELEMENT 书名 (#PCDATA)>
<!ELEMENT 作者 (#PCDATA)>
<!ELEMENT 售价 (#PCDATA)>
建立xml文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE 书架 SYSTEM "book.dtd">
<书架>
<书>
<书名>Java就业培训教程</书名>
<作者>张孝祥</作者>
<售价>39.00</售价>
</书>
<书>
<书名 name="Android经典图书">第一行代码</书名>
<作者>郭霖</作者>
<售价>59.00</售价>
</书>
</书架>
dom解析器解析xml文件
使用dom解析器对xml文件进行crud。
【读取】xml文档中的一个标签内容
public class Demo2 {
// 读取xml文档中 <书名>第一行代码</书名>的值
@Test
public void read() throws ParserConfigurationException, Exception {
// 1、创建工厂
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// 2、得到dom解析器
DocumentBuilder builder = factory.newDocumentBuilder();
// 3、解析xml文档,得到代表文档的document
Document doc = builder.parse("XML/book.xml");
NodeList list = doc.getElementsByTagName("书名");
Node node = list.item(1);
String content = node.getTextContent();
System.out.println(content);
}
}
【读取】xml文件中的全部节点
public class Demo2 {
// 读取xml文件中的全部节点
@Test
public void read2() throws Exception {
// 1、创建工厂
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// 2、得到dom解析器
DocumentBuilder builder = factory.newDocumentBuilder();
// 3、解析xml文档,得到代表文档的document
Document doc = builder.parse("XML/book.xml");
// 得到根节点
Node root = doc.getElementsByTagName("书架").item(0);
list(root);
}
private void list(Node node) {
if (node instanceof Element) {
System.out.println(node.getNodeName());
}
NodeList lists = node.getChildNodes();
for (int i = 0; i < lists.getLength(); i++) {
Node chiled = lists.item(i);
list(chiled);
}
}
}
对xml文件的标签内容进行【增添】操作
// 向xml文档中指定位置添加节点 <售价>100.00</售价>
@Test
public void add() throws Exception {
// 1、创建工厂
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// 2、得到dom解析器
DocumentBuilder builder = factory.newDocumentBuilder();
// 3、解析xml文档,得到代表文档的document
Document doc = builder.parse("XML/book.xml");
// 创建节点
Element price = doc.createElement("售价");
price.setTextContent("100.00");
// 得到参考节点
Element refNode = (Element) doc.getElementsByTagName("售价").item(1);
// 得到要添加的节点
Element book = (Element) doc.getElementsByTagName("书").item(1);
// 往book节点的指定位置添加节点
book.insertBefore(price, refNode);
// 更新后的内存树添加到xml文档中
TransformerFactory tfactory = TransformerFactory.newInstance();
Transformer tf = tfactory.newTransformer();
tf.transform(new DOMSource(doc), new StreamResult(new FileOutputStream(
"XML/book.xml")));
}
对xml文件的标签内容进行【删除】操作
@Test
public void delete() throws Exception {
// 1、创建工厂
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// 2、得到dom解析器
DocumentBuilder builder = factory.newDocumentBuilder();
// 3、解析xml文档,得到代表文档的document
Document doc = builder.parse("XML/book.xml");
// 得到要删除的节点
Element e = (Element) doc.getElementsByTagName("售价").item(1);
e.getParentNode().removeChild(e);
// 更新后的内存树添加到xml文档中
TransformerFactory tfactory = TransformerFactory.newInstance();
Transformer tf = tfactory.newTransformer();
tf.transform(new DOMSource(doc), new StreamResult(new FileOutputStream(
"XML/book.xml")));
}
对xml文件的标签内容进行【更新】操作
@Test
public void update() throws Exception {
// 1、创建工厂
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// 2、得到dom解析器
DocumentBuilder builder = factory.newDocumentBuilder();
// 3、解析xml文档,得到代表文档的document
Document doc = builder.parse("XML/book.xml");
Element element = (Element) doc.getElementsByTagName("售价").item(1);
element.setTextContent("88");
// 更新后的内存树添加到xml文档中
TransformerFactory tfactory = TransformerFactory.newInstance();
Transformer tf = tfactory.newTransformer();
tf.transform(new DOMSource(doc), new StreamResult(new FileOutputStream(
"XML/book.xml")));
}
Dom解析器和Sax解析器的区别
- Dom解析器的优点是对文档的crud比较方便,缺点是占用内存比较大
- Sax解析器优点是占用内存少,解析速度快,缺点是只适合做文档的读取,不适合做文档的crud。
Dom4j解析
Dom4j是一个简单、灵活的开放源代码的库。Dom4j是由早起开发JDOM的人分离出来而独立开发的。与Dom解析相比较,Dom4j使用接口和抽象类。虽然Dom4j的API相对要复杂些,但是它提供了比JDOM更好的灵活性。Dom4j是一个非常优秀的Java XML API,具有性能优异、功能强大和极易使用的特点。现在很多软件采用的Dom4j,例如Hibernate,包括sun公司自己的JAXM也用了Dom4j。
由于Dom4j不是sun公司的技术,因此在java中使用dom4j技术时,首先要加载dom4j相应的jar包。下面就以Dom4j的方式对XML文件进行crut。使用和Dom解析相同的XML文件。
dom4j解析器解析xml文件
以Dom4j的方式对XML文件进行crut
【读取】xml文档中的一个标签内容
// 获得第二本书的书名
@Test
public void read() throws Exception {
// 创建解析器,解析指定文档
SAXReader reader = new SAXReader();
Document document = reader.read(new File("XML/book.xml"));
Element root = document.getRootElement();
Element book = (Element) root.elements("书").get(1);
String bookName = book.element("书名").getText();
System.out.println(bookName);
}
【读取】xml文档中的一个标签属性值
// 获得第二本书的 属性值
@Test
public void read1() throws Exception {
// 创建解析器,解析指定文档
SAXReader reader = new SAXReader();
Document document = reader.read(new File("XML/book.xml"));
Element root = document.getRootElement();
Element book = (Element) root.elements("书").get(1);
String bookValue = book.element("书名").attributeValue("name");
System.out.println(bookValue);
}
对xml文件的标签内容进行【增添】操作
// 为第二本书指定位置添加新的售价
@Test
public void add() throws Exception {
// 创建解析器,解析指定文档
SAXReader reader = new SAXReader();
Document document = reader.read(new File("XML/book.xml"));
// 创建新的售价节点
Element price = DocumentHelper.createElement("售价");
price.setText("100");
Element book = (Element) document.getRootElement().elements("书").get(1);
List list = book.elements();
list.add(2, price);
// 创建标准输出器
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("UTF-8");
// 更新内存
XMLWriter writer = new XMLWriter(new OutputStreamWriter(
new FileOutputStream("XML/book.xml"), "UTF-8"), format);
// XMLWriter writer = new XMLWriter(new FileWriter("XML/book.xml"));
writer.write(document);
writer.close();
}
对xml文件的标签内容进行【删除】操作
// 删除指定标签
@Test
public void delete() throws Exception {
// 创建解析器,解析指定文档
SAXReader reader = new SAXReader();
Document document = reader.read(new File("XML/book.xml"));
Element book = (Element) document.getRootElement().elements("书").get(1);
Element price = (Element) book.elements("售价").get(0);
price.getParent().remove(price);
// 创建标准输出器
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("UTF-8");
// 更新内存
XMLWriter writer = new XMLWriter(new OutputStreamWriter(
new FileOutputStream("XML/book.xml"), "UTF-8"), format);
// XMLWriter writer = new XMLWriter(new FileWriter("XML/book.xml"));
writer.write(document);
writer.close();
}
对xml文件的标签内容进行【更新】操作
// 更新指定标签
@Test
public void update() throws Exception {
// 创建解析器,解析指定文档
SAXReader reader = new SAXReader();
Document document = reader.read(new File("XML/book.xml"));
//更新属性值
/*Element book = (Element) document.getRootElement().elements("书").get(1);
book.element("书名").setAttributeValue("name", "作者为CSDN博主");*/
Element book = (Element) document.getRootElement().elements("书").get(1);
book.element("书名").setText("疯狂Android讲义");
// 创建标准输出器
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("UTF-8");
// 更新内存
XMLWriter writer = new XMLWriter(new OutputStreamWriter(
new FileOutputStream("XML/book.xml"), "UTF-8"), format);
// XMLWriter writer = new XMLWriter(new FileWriter("XML/book.xml"));
writer.write(document);
writer.close();
}