import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.junit.Test;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
/**
* JAXP的DOM方式解析XML
* JAXP 是java提供处理xml文档的接口,用的类是W3c下面的类,JAXP包含DOM和SAX解析两种方式;
操作的是scr目录下的book.xml:
<?xml version ="1.0" encoding="UTF-8" standalone="no" ?><书架>
<书 id= "b1" 出版日期= "2013-01-01" 出版社= "清华出版社" >
<书名 >葵花宝典</ 书名>
<作者 >春哥</ 作者>
<售价 >39.3</ 售价>
<简介 >自宫!</ 简介>
<书 id= "b2" 出版社= "邮电出版社" >
<书名 >九阴真经</ 书名>
<作者 >王重阳</ 作者>
<售价 >59.8</ 售价>
<简介 >白骨爪</ 简介>
</书 >
</书架>
*
*/
public class JAXPTest {
@Test
/**
* 单元测试的方法:必须是public void 方法名 () 方法中不能有参数.需要导入JUnit 4包
* 1.对xml进行查询。获得第一本书的作者节点 <作者>春哥</作者>
*/
public void demo1() throws Exception {
/**
*JAXP DOM方式解析;
* 1.创建解析器工厂 2.由解析器工厂 来 创建解析器 3.通过解析器解析XML文档. --- Document
* 4.通过Document对象获得想去操作的节点.
*/
// 创建解析器工厂.
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// 由工厂创建解析器
DocumentBuilder builder = factory.newDocumentBuilder();
// 解析XML。
Document document = builder.parse("src/book.xml" );
// 通过Document对象获得想去操作的节点.、
NodeList nodeList = document.getElementsByTagName("作者" );
Node node = nodeList.item(1);
String value = node.getTextContent();
System.out.println(value);
}
/**
* 2.在第一本书的下面 添加一个作者节点 <作者> 曾哥</作者>
* * 1.创建解析器工厂
* 2.由解析器工厂 来 创建解析器
* 3.通过解析器解析XML文档. --- Document
* 4.创建一个节点 <作者> 添加文本内容 曾哥. 5.找到第一本书的节点。 6.给书的节点
* 添加一个子节点.
*
*/
@Test
public void demo2() throws Exception {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse("src/book.xml" );
// 创建一个作者节点:
Element author = document.createElement("作者" );
// 设置内容
author.setTextContent( "曾哥");
// 找到第一本书
Node node = document.getElementsByTagName("书" ).item(0);
// 项第一本书下 添加一个节点.
node.appendChild(author);
// 回写XML --- 将内存中的树形结构 写回到 XML中 (了解)
TransformerFactory tFactory = TransformerFactory.newInstance();
Transformer transformer = tFactory.newTransformer();
transformer.transform( new DOMSource(document), new StreamResult(
"src/book.xml"));
}
/**
* 3.在指定的位置添加节点。在 <作者>春哥</作者> 之前添加一个 <作者> 汪峰</作者>
*/
@Test
public void demo3() throws Exception {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse("src/book.xml" );
// 创建一个节点 给节点 添加一个文本内容
Element author = document.createElement("作者" );
author.setTextContent( "汪峰");
// 先找到 春哥的 作者的节点。
Node node = document.getElementsByTagName("作者" ).item(0);
// 找到其父节点
node.getParentNode().insertBefore(author, node);
TransformerFactory tFactory = TransformerFactory.newInstance();
Transformer transformer = tFactory.newTransformer();
transformer.transform( new DOMSource(document), new StreamResult(
"src/book.xml"));
}
/**
* 4.修改文本内容.<作者>汪峰 </作者> 改成 <作者> 章子怡</作者>
*/
@Test
public void demo4()throws Exception{
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse("src/book.xml" );
// 找到汪峰节点.
Node node = document.getElementsByTagName("作者" ).item(0);
node.setTextContent( "章子怡");
TransformerFactory tFactory = TransformerFactory.newInstance();
Transformer transformer = tFactory.newTransformer();
transformer.transform( new DOMSource(document), new StreamResult(
"src/book.xml"));
}
/**
* 5.删除章子怡的作者节点.
*/
@Test
public void demo5()throws Exception{
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse("src/book.xml" );
// 找到该节点,父节点删除之;
Node node = document.getElementsByTagName("作者" ).item(0);
node.getParentNode().removeChild(node);
TransformerFactory tFactory = TransformerFactory.newInstance();
Transformer transformer = tFactory.newTransformer();
transformer.transform( new DOMSource(document), new StreamResult(
"src/book.xml"));
}
/**
* 扩展: 遍历所有的节点名称
*/
@Test
public void demo6()throws Exception{
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse("src/book.xml" );
// 调用list的方法
list(document);
}
private void list(Node node) {
// 判断Node是否是Element类型的
if(node.getNodeType() == Node.ELEMENT_NODE ){
System.out.println(node.getNodeName());
}
// 获得所有的孩子节点
NodeList nodeList = node.getChildNodes();
for (int i = 0; i < nodeList.getLength(); i++) {
Node n = nodeList.item(i);
// 递归
list(n);
}
}
/**
* 7.操作节点的属性.获得第一本书的出版社.
*/
@Test
public void demo7()throws Exception{
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse("src/book.xml" );
// 找到了第一本书
Node node = document.getElementsByTagName("书" ).item(0);
// 如果父类没有这个方法 可以 转成 子类对象.
Element element = null;
if(node.getNodeType() == Node.ELEMENT_NODE ){
element = (Element) node;
System.out.println(element);
}
System.out.println(element.getAttribute( "出版社"));
}
}
利用JAXP的DOM方式对xml文档进行解析
最新推荐文章于 2024-08-14 19:00:37 发布