您的位置:首页 > 其它

jaxp解析xml

2018-01-28 15:01 162 查看
因为jaxp是sun公司推出的一个解析xml的技术,所以在解析xml时,不用像dom4j一样导入jar包。jaxp用到的东西都包含在jre中。使用jaxp的局限性较大,比如不能创建一个xml文件,只能读取已有的文件。

这里简单介绍jaxp对xml的CRUD操作。

要操作的testBook.xml文件

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<书架>
<书 id="b1">
<书名>Book1</书名>
<作者>auther1</作者>
<售价>50元</售价>
</书>
<书 id="b2">
<书名>Book2</书名>
<作者>auther2</作者>
<售价>价格2</售价>
</书>
</书架>


增加一个新书节点。

public class Demo1 {

public static void main(String[] args) throws Exception {

//获取Document工厂对象
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
// 创建DocumentBuilder对象
DocumentBuilder db = dbf.newDocumentBuilder();
// 获取目标文件,注意路径
Document doc = db.parse("src/xml/dom/jaxp/testBook.xml");

// 创建 书 节点
Element ele = doc.createElement("书");
// 设置属性
ele.setAttribute("id", "b3");

// 增加 书名,作者,售价 节点
Element name = doc.createElement("书名");
// 设置内容
name.setTextContent("Book3");
Element au = doc.createElement("作者");
au.setTextContent("作者3");
Element pr = doc.createElement("售价");
pr.setTextContent("价格3");
// 将3个节点挂到书的节点下
ele.appendChild(name);
ele.appendChild(au);
ele.appendChild(pr);

// 在将 书 节点 挂到根节点下
// 得到根节点
Element root = (Element) doc.getElementsByTagName("书架").item(0);
// 挂载
root.appendChild(ele);

// 将改变的节点的xml从内存中写到磁盘中,需要转换对象,毕竟不能直接将内存输出是吧。
// 获取转换工厂对象
TransformerFactory tff = TransformerFactory.newInstance();
// 获取转换对象
Transformer tf = tff.newTransformer();
// 将xml对象转为输出流
tf.transform(new DOMSource(doc), new StreamResult(new FileOutputStream("src/xml/dom/jaxp/testBook.xml")));

System.out.println("over");
}
}


运行后,testBook.xml为

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<书架>
<书 id="b1">
<书名>Book1</书名>
<作者>auther1</作者>
<售价>50元</售价>
</书>
<书 id="b2">
<书名>Book2</书名>
<作者>auther2</作者>
<售价>价格2</售价>
</书>
<书 id="b3">
<书名>Book3</书名>
<作者>作者3</作者>
<售价>价格3</售价>
</书>
</书架>


修改节点:修改第三本书的售价。

public class Demo1 {

public static void main(String[] args) throws Exception {
// 得到目标文件的document对象
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse("src/xml/dom/jaxp/testBook.xml");

// 得到要修改的节点
Element ele = (Element) doc.getElementsByTagName("售价").item(2);
ele.setTextContent("50元");

// 将xml重新写入磁盘
TransformerFactory tff = TransformerFactory.newInstance();
Transformer tf = tff.newTransformer();
tf.transform(new DOMSource(doc), new StreamResult(new FileOutputStream("src/xml/dom/jaxp/testBook.xml")));

System.out.println("over");
}

}


运行后xml文档为:

<?xml version="1.0" encoding="UTF-8" standalone="no"?><书架>
<书 id="b1">
<书名>Book1</书名>
<作者>auther1</作者>
<售价>50元</售价>
</书>
<书 id="b2">
<书名>Book2</书名>
<作者>auther2</作者>
<售价>价格2</售价>
</书>
<书 id="b3">
<书名>Book3</书名>
<作者>作者3</作者>
<售价>50元</售价>
</书>
</书架>


删除节点:删除第三本书。

public class Demo1 {

public static void main(String[] args) throws Exception {
// 得到目标文件的document对象
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse("src/xml/dom/jaxp/testBook.xml");

// 得到第二本书
Element ele = (Element) doc.getElementsByTagName("书").item(2);
// 删除节点
ele.getParentNode().removeChild(ele);

// 将xml重新写入磁盘
TransformerFactory tff = TransformerFactory.newInstance();
Transformer tf = tff.newTransformer();
tf.transform(new DOMSource(doc), new StreamResult(new FileOutputStream("src/xml/dom/jaxp/testBook.xml")));

System.out.println("over");
}

}


运行后:

<?xml version="1.0" encoding="UTF-8" standalone="no"?><书架>
<书 id="b1">
<书名>Book1</书名>
<作者>auther1</作者>
<售价>50元</售价>
</书>
<书 id="b2">
<书名>Book2</书名>
<作者>auther2</作者>
<售价>价格2</售价>
</书>

</书架>


读取节点:遍历节点

public class Demo1 {

public static void main(String[] args) throws Exception {
// 获得工厂类
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

// 获得解析对象
DocumentBuilder db = dbf.newDocumentBuilder();

// 解析目标文件
Document doc = db.parse("src/xml/dom/jaxp/testBook.xml");

// 获得目标文件的根节点
Element root = doc.getDocumentElement();

// 获取指定的节点
System.out.println("-----得到书名-----");
NodeList nodes = doc.getElementsByTagName("书名");
for(int i = 0; i < nodes.getLength(); i++){
Node node = nodes.item(i);
System.out.println("第"+(i+1)+"本书的书名是:"+node.getTextContent());
}

// 遍历节点名
System.out.println("-----遍历节点-----");
list(root);

// 获得指定属性值
System.out.println("-----获得指定属性值-----");
String attr = ((Element)doc.getElementsByTagName("书").item(0)).getAttribute("id");
System.out.println("第一本书的id为:"+attr);
}

}


运行结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: