JAXP技术
JAXP即Java Api for Xml Processing该API主要是SUN提供的用于解析XML数据的一整套解决方案,主要包含了DOM和SAX解析技术。大家可以参见SUN的以下两个包:
javax.xml.parsers.* 主要存储的是解析器
org.w3c.dom.*或org.w3c.sax.* 主要存储的是DOM解析或SAX解析需要的API
DOM解析主要采用DOM树的方式进行XML的数据解析。如:JavaScript中的DOM操作
SAX解析主要采用事件的方式进行XML的数据解析。 如:JavaScript中的事件机制
- 编写需要解析的XML文件
- 获取相应的XML解析器对象
- 使用API获取数据
- 返回数据给开发者
其中回车换行也算是一个元素,所以底下xml文件中的users节点有个节点,其中3个为#text的打印
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<users>
<user>
<name>jack</name>
<age>26</age>
<address>gz</address>
</user>
<user><name>二货</name><age>28</age><address>天河区</address></user>
</users>
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList; public class Demo1 { // 2. 提供获取解析器的方法
public static DocumentBuilder getParser()throws Exception{
// 2.1 创建工厂类对象
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// 2.2 获取解析器对象
DocumentBuilder parser = factory.newDocumentBuilder();
return parser;
} // 3. 提供获取DOM数据的方法
public static Document getDOM(File file)throws Exception{
// 3.1 获取解析器
DocumentBuilder parser = getParser();
// 3.2解析数据
Document dom = parser.parse(file);
return dom;
} // 4. 提供解析根元素的数据的方法
public static void getRoot(File file)throws Exception{
// 4.1 获取DOM树
Document dom = getDOM(file);
// 4.2遍历dom树找根元素
Node node = dom.getElementsByTagName("users").item(0);
// 4.3输出根元素的名
System.out.println(node.getNodeName());
// 4.4根据节点直接的关系获取根元素
NodeList list = dom.getChildNodes();
Node root = list.item(0);
System.out.println(root.getNodeName());
root = dom.getFirstChild();
System.out.println(root.getNodeName());
root = dom.getLastChild();
System.out.println(root.getNodeName());
} // 5. 添加一个user节点
public static Document addElement(File file)throws Exception{
// 5.1获取DOM树
Document dom = getDOM(file);
// 5.2创建user元素
Element user = dom.createElement("user");
Element name = dom.createElement("name");
Element age = dom.createElement("age");
Element address = dom.createElement("address"); name.setTextContent("焦宁波");
age.setTextContent("28");
address.setTextContent("天河区");
// 5.3建立关系
Element root = (Element) dom.getFirstChild();
user.appendChild(name);
user.appendChild(age);
user.appendChild(address);
root.appendChild(user);
// 5.4返回修改后的DOM树对象
return dom;
} // 6. 修改第二个user的年龄为30岁
public static Document modifyElement(File file)throws Exception{
// 6.1获取DOM树
Document dom = getDOM(file);
// 6.2获取第二个age元素
Node age2 = dom.getElementsByTagName("age").item(1);
// 6.3设置文本值
age2.setTextContent("30");
return dom;
} // 7. 删除第一个user节点
public static Document removeElement(File file)throws Exception{
// 7.1获取DOM树
Document dom = getDOM(file);
// 7.2获取user的父亲
dom.getElementsByTagName("user").item(0).getParentNode().removeChild(dom.getElementsByTagName("user").item(0));
return dom;
} // 8. 使用关系获取节点
public static void searchElement(File file)throws Exception{
// 8.1获取DOM树
Document dom = getDOM(file);
// 8.2获取第二个user的所有的子元素并输入元素名
Element user2 = (Element) dom.getElementsByTagName("user").item(1);
// 8.3获取所有的儿子
NodeList list = user2.getChildNodes();
// 8.4遍历所有的孩子
for(int i = 0;i<list.getLength();i++){
Node node = list.item(i);
System.out.println(node.getNodeName());
}
// 8.5获取第二个user的address元素
Element address2 = (Element) list.item(2);
System.out.println(address2.getNodeName());
Node age2 = address2.getPreviousSibling();
System.out.println(age2.getNodeName()); Element name2 = (Element) list.item(0);
System.out.println(name2.getNodeName());
age2 = name2.getNextSibling();
System.out.println(age2.getNodeName()); } // 提供一个工具方法将内存中的DOM树存储到磁盘的指定文件中
public static void writeDOM2XML(Document dom,File file)throws Exception{
// 1.获取转换器的工厂类对象
TransformerFactory factory = TransformerFactory.newInstance();
// 2.获取转换器对象
Transformer trans = factory.newTransformer();
// 3.转换
trans.transform(new DOMSource(dom), new StreamResult(new FileOutputStream(file)));
} public static void main(String[] args) throws Exception{
File file = new File("users.xml");
//getRoot(file);
//Document dom = addElement(file);
//Document dom = modifyElement(file);
//Document dom = removeElement(file);
//writeDOM2XML(dom, file);
searchElement(file); } }