Demo.java实现了5个功能
1. 读取某个标签的值
2. 打印所有xml标签
3. 获得某个标签的指定属性
4. 在指定节点后面增加标签
5. 给指定节点增加属性
删除功能跟增加差不多,只是用了不同的方法,本人就没有具体代码实现
book.xml
<?xml version="1.0" encoding="UTF-8"?>
<书架>
<书>
<书名 name="base">Java基础</书名>
<作者>abc</作者>
<售价> 39.00元</售价>
</书>
<书>
<书名>Java进阶</书名>
<作者>abc</作者>
<售价> 88.88元</售价>
</书>
</书架>
Demo.java
package learn.java.xml;
import java.io.FileOutputStream;
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.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
// 用Jaxp解析xml
public class Demo {
public static void main(String[] args) throws Exception {
Demo demo = new Demo();
demo.read();
System.out.println("**********");
demo.readAll();
System.out.println("**********");
demo.readAttr();
// 添加
demo.add();
demo.setAttr();
}
// 读取第二本书的书名 Java进阶
public void read() throws Exception {
// 1.创建工厂
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// 2.得到Dom解析器
DocumentBuilder builder = factory.newDocumentBuilder();
// 3.解析xml文档
Document doc = builder.parse("src/book.xml");
NodeList list = doc.getElementsByTagName("书名");
Node node = list.item(1); // 第二本书的书名 Java进阶
String text = node.getTextContent();
System.out.println(text);
}
// 打印所有标签
public void readAll() throws Exception {
// 1.创建工厂
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// 2.得到Dom解析器
DocumentBuilder builder = factory.newDocumentBuilder();
// 3.解析xml文档
Document doc = builder.parse("src/book.xml");
// 得到根节点
Node root = doc.getElementsByTagName("书架").item(0);
list(root);
}
// 遍历所有节点
public void list(Node node) throws Exception {
if (node instanceof Element) { // 是标签类型,打印(有些节点不是标签)
System.out.println(node.getNodeName());
}
NodeList nodes = node.getChildNodes();
for (int i = 0; i < nodes.getLength(); i++)
list(nodes.item(i));
}
// 获得某个标签的指定属性
public void readAttr() throws Exception {
// 1.创建工厂
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// 2.得到Dom解析器
DocumentBuilder builder = factory.newDocumentBuilder();
// 3.解析xml文档
Document doc = builder.parse("src/book.xml");
// 得到根节点
Node node = doc.getElementsByTagName("书名").item(0);
// Node类没有提供获得指定标签的方法
// 需要强制转换成Element(Node子类),它有获得指定属性的方法
Element elem = (Element) node;
String value = elem.getAttribute("name");
System.out.println(value);
}
// 在指定位置后面添加标签
public void add() throws Exception {
// 1.创建工厂
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// 2.得到Dom解析器
DocumentBuilder builder = factory.newDocumentBuilder();
// 3.解析xml文档
Document doc = builder.parse("src/book.xml");
// 创建节点
Element discount = doc.createElement("打折");
discount.setTextContent("9折");
// 把新节点挂到第一本书的"售价"标签之前上
Element book = (Element)doc.getElementsByTagName("书").item(0);
Node nodeBef = doc.getElementsByTagName("售价").item(0);
book.insertBefore(discount,nodeBef); // 前面节点 插到 后面节点 的 后面
// 保存到文件
TransformerFactory tfFactory = TransformerFactory.newInstance();
Transformer tf = tfFactory.newTransformer();
tf.transform(new DOMSource(doc),new StreamResult(new FileOutputStream("src/book.xml")));
}
// 添加标签属性
public void setAttr() throws Exception {
// 1.创建工厂
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// 2.得到Dom解析器
DocumentBuilder builder = factory.newDocumentBuilder();
// 3.解析xml文档
Document doc = builder.parse("src/book.xml");
// 把新节点挂到第一本书的"售价"标签之前上
Element book = (Element)doc.getElementsByTagName("书名").item(1);
book.setAttribute("name","advanced");
// 保存到文件
TransformerFactory tfFactory = TransformerFactory.newInstance();
Transformer tf = tfFactory.newTransformer();
tf.transform(new DOMSource(doc),new StreamResult(new FileOutputStream("src/book.xml")));
}
}