JAXP的API都在JavaSE中。
org.w3c.dom:提供DOM方式解析XML的标准接口
org.xml.sax:提供SAX方式解析XML的标准接口
javax.xml:提供了解析XML文档的类
解析原理:
对下面的book.xml文档进行解析的实例:
<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE 书架 SYSTEM "book.dtd">
<书架>
<书 ISBN="a" 出版社="北京传智">
<书名>Java就业培训教程</书名>
<作者>&wzt;</作者>
<售价>39.00元</售价>
</书>
<书 ISBN="b">
<书名>JavaScript网页开发</书名>
<作者>&wzt;</作者>
<售价>28.00元</售价>
</书>
</书架>
// 利用JAXP进行DOM方式解析
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
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.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
public class JaxpDomDemo {
public static void main(String[] args) throws Exception {
// 得到解析工厂DocumentBuilderFactory
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// 得到解析器DocumentBuilder
DocumentBuilder builder = factory.newDocumentBuilder();
// 解析指定的xml文档,得到代表内存DOM树的Document对象
Document document = builder.parse("src/book.xml");
test1(document);
}
// 1.得到某个具体节点的内容: 打印第2本书的作者
public static void test1(Document document){
// 根据标签的名称获取所有的作者元素
NodeList nodes = document.getElementsByTagName("作者");
// 按照索引获取第2个作者元素
Node node = nodes.item(1);
// 打印该元素的文本
String text = node.getTextContent();
System.out.println(text);
}
// 2.遍历所有元素节点:打印所有元素的名称
public static void test2(Node node){
// 判断当前节点是否为元素节点
if(node.getNodeType()==Node.ELEMENT_NODE){
// 如果是,则打印他的名称
System.out.println(node.getNodeName());
}
// 如果不是,找到它的孩子节点
NodeList nodes = node.getChildNodes();
int len = nodes.getLength();
for (int i = 0; i < len; i++) {
// 递归遍历孩子节点
Node n = nodes.item(i);
test2(n);
}
}
// 3. 修改某个元素节点的主体内容: 把第一本书的售价改为38.00元
public static void test3(Document document) throws Exception{
// 找到第一本书的售价
NodeList nodes = document.getElementsByTagName("售价");
// 设置其主题内容
Node node = nodes.item(0);
node.setTextContent("38.00元");
// 把内存中的Document书写回xml文件中
TransformerFactory factory = TransformerFactory.newInstance();
Transformer ts = factory.newTransformer();
ts.transform(new DOMSource(document), new StreamResult("src/book.xml"));
}
// 4. 向指定元素节点中增加子元素节点: 第一本书中增加子元素<内部价>10.00元</内部价>
public static void test4(Document document) throws Exception{
// 创建一个新元素并设置其主题内容
Element e = document.createElement("内部价");
e.setTextContent("10.00元");
// 找到第一本书元素
Node firstBookNode = document.getElementsByTagName("书").item(0);
// 把新节点连接到第一本书上
firstBookNode.appendChild(e);
// 把内存中的Document书写会xml文件中
TransformerFactory factory = TransformerFactory.newInstance();
Transformer ts = factory.newTransformer();
ts.transform(new DOMSource(document), new StreamResult("src/book.xml"));
}
// 5. 向指定元素节点上添加同级元素节点: 在第一本书的售价前面增加批发价
public static void test5(Document document) throws Exception{
// 创建一个新元素并设置其主体内容
Element e = document.createElement("批发价");
e.setTextContent("30.00元");
// 找到第一本书的售价节点
Node firstPriceNode = document.getElementsByTagName("售价").item(0);
// 在售价节点的前面添加新建元素节点,注意: 增加子元素一定要使用父节点来做
firstPriceNode.getParentNode().insertBefore(e,firstPriceNode);
// 把内存中的Document写回XML文件中
TransformerFactory factory = TransformerFactory.newInstance();
Transformer ts = factory.newTransformer();
ts.transform(new DOMSource(document), new StreamResult("src/book.xml"));
}
// 6. 删除指定元素节点: 删除内部价节点
public static void test6(Document document) throws Exception{
// 找到内部价节点
Node innerPriceNode = document.getElementsByTagName("内部价").item(0);
// 用父节点删除内部价节点
innerPriceNode.getParentNode().removeChild(innerPriceNode);
// 把内存中的Document写回xml文件中
TransformerFactory factory = TransformerFactory.newInstance();
Transformer ts = factory.newTransformer();
ts.transform(new DOMSource(document), new StreamResult("src/book.xml"));
}
// 7. 操作xml属性: 打印第一本书的出版社
public static void test7(Document document){
// 得到第一本书节点
Node firstBookNode = document.getElementsByTagName("书").item(0);
// 打印指定属性的取值,注意: 要将节点强制转换成元素,因为属性是元素的属性
Element e = (Element)firstBookNode;
System.out.println(e.getAttribute("出版社"));
}
// 8. 给第二本书添加一个属性: 出版公司: 北大书店公司
public static void test8(Document document) throws Exception{
// 得到第二本书节点
Node secondBookNode = document.getElementsByTagName("书").item(1);
// 添加新属性并设置取值: 注意要将节点强制转换成元素
Element e = (Element)secondBookNode;
e.setAttribute("出版公司", "北大书店公司");
// 把内存中的Document写回到xml文件中
TransformerFactory factory = TransformerFactory.newInstance();
Transformer ts = factory.newTransformer();
ts.transform(new DOMSource(document), new StreamResult("src/book.xml"));
}