解析XML通过JAXP的DOM(DEMO)
废话不多说,自行测试跟看1.6以上的JDK API
目录结构:
XML文件内容:
XML代码:
<?xml version="1.0" encoding="UTF-8" standalone="no"?><书架>
<书 批发价="30">
<书名>java编程思想</书名>
<作者>James</作者>
<价格>89</价格>
</书>
<书>
<书名>C Primer</书名>
<作者>JJ</作者>
<价格>30</价格>
</书>
</书架>
代码块:
package com.csa.dom;
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;
public class Main {
public static void main(String[] args) throws Exception {
//从Document工厂生产一个Burilder
DocumentBuilder documentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
//通过parse()方法获取一个对象
Document document = documentBuilder.parse("src/Book.xml");
//getContentByNameAndIndex(document, "书名", 2);
//printByNode(document, -1);
//setContentByNodeAndIndex(document, "价格", 2, "30");
//insertNewToNodeBefore(document, "书名", 1, createNode(document, "批发价", "20"), false);
//appendChildToParent(document, "书", 1, createNode(document, "批发价", "20"));
//removeNodeByName(document, "批发价", 1);
//opElementByDom(document, "书", 1, "id", "1");
}
/**
* 获得某个具体的节点内容,通过标签名字跟位置
* @param dom Document对象
* @param name 查找的标签名字
* @param index 第几个标签
*/
private static void getContentByNameAndIndex(Document dom, String name, int index){
Node item = dom.getElementsByTagName(name).item(index-1);
System.out.println(item.getTextContent());
}
/**
* 遍历所有节点
* @param node 要遍历的节点
* @param hi 深度
*/
private static void printByNode(Node node, int hi){
if(node.getNodeType()==Node.ELEMENT_NODE){
for(int i=0;i<hi;i++){
System.out.printf("\t");
}
System.out.println(node.getNodeName());
}
NodeList childNodes = node.getChildNodes();
for(int i=0;i<childNodes.getLength();i++){
printByNode(childNodes.item(i), hi+1);
}
}
/**
* 修改某个元素节点内容
* @param dom document对象
* @param name 标签名字
* @param index 位置
* @param replace 替换内容
*/
private static void setContentByNodeAndIndex(Document dom, String name, int index, String replace) throws Exception{
dom.getElementsByTagName(name).item(index-1).setTextContent(replace);
//获取transform对象
Transformer transformer = TransformerFactory.newInstance().newTransformer();
//将更改过的dom写到原来的xml里面
transformer.transform(new DOMSource(dom), new StreamResult(dom.getBaseURI()));
}
/**
* 创建一个节点
* @param dom document对象
* @param nodename 节点名字
* @param content 节点内容
* @return 一个节点对象
*/
private static Node createNode(Document dom, String nodename, String content){
Node node = dom.createElement(nodename);
node.setTextContent(content);
return node;
}
/**
* 向指定元素节点中添加子元素节点
* @param dom document对象
* @param parent 父节点名字
* @param index 第几个父节点
* @param newnode 孩子节点
*/
private static void appendChildToParent(Document dom, String parent, int index, Node newnode) throws Exception{
Node item = dom.getElementsByTagName(parent).item(index-1);
item.appendChild(newnode);
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.transform(new DOMSource(dom), new StreamResult(dom.getBaseURI()));
}
/**
* 向指定元素节点上增加同级元素节点
* @param dom document对象
* @param nodename 节点名字
* @param index 位置
* @param newnode 兄弟节点
* @param isbefore 插入在节点之前则true
*/
private static void insertNewToNodeBefore(Document dom, String nodename, int index, Node newnode, boolean isbefore) throws Exception{
Node item = dom.getElementsByTagName(nodename).item(index-1);
if(isbefore)
item.getParentNode().insertBefore(newnode, item);
else
item.getParentNode().insertBefore(newnode, item.getNextSibling());
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.transform(new DOMSource(dom), new StreamResult(dom.getBaseURI()));
}
/**
* 删除指定元素节点
* @param dom document对象
* @param name 删除的节点名字
* @param index 位置
*/
private static void removeNodeByName(Document dom, String name, int index) throws Exception{
Node item = dom.getElementsByTagName(name).item(index-1);
item.getParentNode().removeChild(item);
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.transform(new DOMSource(dom), new StreamResult(dom.getBaseURI()));
}
/**
* 操作XML文件属性
* @param dom document对象
* @param tagname 标签名字
* @param index 位置
* @param key 属性
* @param value 属性值
*/
private static void opElementByDom(Document dom, String tagname, int index, String key, String value) throws Exception{
Node item = dom.getElementsByTagName(tagname).item(index-1);
Element elem = (Element)item;
elem.setAttribute(key, value);
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.transform(new DOMSource(dom), new StreamResult(dom.getBaseURI()));
}
}