1.XML解析方式分为两种:dom和sax
2.XML解析器
Crimson、Xerces 、Aelfred2
3.XML解析开发包
Jaxp、Jdom、dom4j
4.使用jaxp解析xml文档
在 javax.xml.parsers 包中,定义了几个工厂类,调用这些工厂类,可以得到对xml文档进行解析的 DOM 或 SAX 的解析器对象。
5.DOM解析器在解析XML文档时,会把文档中的所有元素,按照其出现的层次关系,解析成一个个Node对象(节点)。
6.使用jaxp进行DOM解析
1)调用 DocumentBuilderFactory.newInstance() 方法得到创建 DOM 解析器的工厂。
2)调用工厂对象的 newDocumentBuilder方法得到 DOM 解析器对象。
7.增删改查XML文档
2.XML解析器
Crimson、Xerces 、Aelfred2
3.XML解析开发包
Jaxp、Jdom、dom4j
4.使用jaxp解析xml文档
在 javax.xml.parsers 包中,定义了几个工厂类,调用这些工厂类,可以得到对xml文档进行解析的 DOM 或 SAX 的解析器对象。
5.DOM解析器在解析XML文档时,会把文档中的所有元素,按照其出现的层次关系,解析成一个个Node对象(节点)。
6.使用jaxp进行DOM解析
1)调用 DocumentBuilderFactory.newInstance() 方法得到创建 DOM 解析器的工厂。
2)调用工厂对象的 newDocumentBuilder方法得到 DOM 解析器对象。
3)调用 DOM 解析器对象的 parse() 方法解析 XML 文档,得到代表整个文档的 Document 对象,进行可以利用DOM特性对整个XML文档进行操作了。
package cn.lsl.xml;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
/**
* 得到dom解析器
* @author LSL
*
*/
public class Demo1 {
public static void main(String[] args) throws Exception {
//得到创建 DOM 解析器的工厂
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
//得到 DOM 解析器对象
DocumentBuilder builder = factory.newDocumentBuilder();
System.out.println(builder);
//调用 DOM 解析器对象的 parse() 方法解析 XML 文档,得到代表整个文档的 Document 对象,进行可以利用DOM特性对整个XML文档进行操作了。
Document document = builder.parse("src/cn/lsl/xml/book.xml");
}
}
7.增删改查XML文档
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<书架>
<书>
<书名>java</书名>
<作者 id="12">小明</作者>
<售价 type="rmb">19元</售价>
</书>
<书>
<书名>javaweb</书名>
<作者>wangwu</作者>
<售价>28.00元</售价>
</书>
</书架>
package cn.lsl.xml;
import java.io.FileOutputStream;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.junit.Before;
import org.junit.Test;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class Demo {
private Document document;
@Before
public void before() throws Exception{
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
document = builder.parse("src/cn/lsl/xml/book.xml");
}
//遍历
@Test
public void listXml(){
list(document);
}
public void list(Node node){
System.out.println(node.getNodeName());
NodeList list = node.getChildNodes();
for(int i=0; i<list.getLength(); i++){
Node child = list.item(i);
list(child);
}
}
//获取节点的值
@Test
public void test1(){
Document document = this.document;
Node node = document.getElementsByTagName("书名").item(0);
String value = node.getTextContent();
System.out.println(value);
}
获得节点属性
@Test
public void test2(){
Document document = this.document;
Node node = document.getElementsByTagName("售价").item(0);
Element price = (Element)node;
String attValue = price.getAttribute("type");
System.out.println(attValue);
}
//添加节点
@Test
public void test3() throws Exception{
Document document = this.document;
//创建要添加的节点
Element price = document.createElement("售价");
price.setTextContent("30元");
//把创建的节点添加到书节点下
Node book = document.getElementsByTagName("书").item(0);
book.appendChild(price);
//把内存中更新后的树对象,重新定位到xml文档中
TransformerFactory factory = TransformerFactory.newInstance();
Transformer tf = factory.newTransformer();
tf.transform(new DOMSource(document),
new StreamResult(new FileOutputStream("src/cn/lsl/xml/book.xml")));
}
//向指定位置上添加售价节点
@Test
public void test4() throws Exception{
Document document = this.document;
//创建要添加的节点
Element price = document.createElement("售价");
price.setTextContent("22元");
//得到要挂的节点
Node book = document.getElementsByTagName("书").item(0);
//向参考节点前,挂新节点
book.insertBefore(price, document.getElementsByTagName("售价").item(0));
//保存
TransformerFactory factory = TransformerFactory.newInstance();
Transformer tf = factory.newTransformer();
tf.transform(new DOMSource(document),
new StreamResult(new FileOutputStream("src/cn/lsl/xml/book.xml")));
}
//向xml文档中添加节点属性
@Test
public void test5() throws Exception{
Document document = this.document;
//得到要添加的属性的节点
Element author = (Element)document.getElementsByTagName("作者").item(0);
author.setAttribute("id", "1");
//保存
TransformerFactory factory = TransformerFactory.newInstance();
Transformer tf = factory.newTransformer();
tf.transform(new DOMSource(document),
new StreamResult(new FileOutputStream("src/cn/lsl/xml/book.xml")));
}
//删除xml文档中的售价节点
@Test
public void test6() throws Exception{
Document document = this.document;
//得到要删除的节点
Node price = document.getElementsByTagName("售价").item(0);
//得到要删除的节点的夫节点
Node parent = document.getElementsByTagName("书").item(0);
parent.removeChild(price);
//保存
TransformerFactory factory = TransformerFactory.newInstance();
Transformer tf = factory.newTransformer();
tf.transform(new DOMSource(document),
new StreamResult(new FileOutputStream("src/cn/lsl/xml/book.xml")));
}
//删除售价节点所在的书节点
@Test
public void test7() throws Exception{
Document document = this.document;
//得到要删除的节点
Node price = document.getElementsByTagName("售价").item(0);
price.getParentNode().getParentNode().removeChild(price.getParentNode());
//保存
TransformerFactory factory = TransformerFactory.newInstance();
Transformer tf = factory.newTransformer();
tf.transform(new DOMSource(document),
new StreamResult(new FileOutputStream("src/cn/lsl/xml/book.xml")));
}
//更新节点
@Test
public void test8() throws Exception{
Document document = this.document;
document.getElementsByTagName("售价").item(1).setTextContent("55元");
//保存
TransformerFactory factory = TransformerFactory.newInstance();
Transformer tf = factory.newTransformer();
tf.transform(new DOMSource(document),
new StreamResult(new FileOutputStream("src/cn/lsl/xml/book.xml")));
}
}