DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准。DOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而DOM被认为是基于树或基于对象的。 DOM 以及广义的基于树的处理具有几个优点。首先,由于树在内存中是持久的,因此可以修改它以便应用程序能对数据和结构作出更改。它还可以在任何时候在树中上下导航,而不是像SAX那样是一次性的处理。DOM使用起来 也要简单得多。
下面列出实例,首先是需要操作的XML文件:
<?xml version="1.0" encoding="UTF-8" standalone="no"?><书架>
<书 name="XXX">
<书名>java编程思想4</书名>
<售价>39</售价>
</书>
<书>
<书名>java编程思想2</书名>
<作者>BBB</作者>
<售价>0</售价>
</书>
</书架>
接下来是JAXP对XML的操作
import java.io.File;
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.Attr;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class XmlParserDemo {
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
// 新建一个DocumentBuilderFactory 解析器工厂
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// 通过解析器工厂产生一个解析器对象
DocumentBuilder builder = factory.newDocumentBuilder();
// 解析器对象有一个parse的方法可以读进来一个xml文件
// 读到的xml文件是以document对象的方式保存在内存中的
Document document = builder.parse("src/book.xml");
// listAllNode(document);
//listAllNode1(document);
readElement(document);
//update(document);
//readAttribute(document);
//add(document);
//add1(document);
//delete(document);
//removeAttribute(document);
//addAttribute(document);
//updateAttribute(document);
}
//打印所有节点的名字
public static void listAllNode(Node node) {
System.out.println(node.getNodeName());
NodeList list = node.getChildNodes();
for (int i = 0; i < list.getLength(); i++) {
Node child = list.item(i);
listAllNode(child);
}
}
//打印所有元素节点的名字
public static void listAllNode1(Node node) {
if (node.getNodeType() == Node.ELEMENT_NODE) {
System.out.println(node.getNodeName());
}
NodeList list = node.getChildNodes();
for (int i = 0; i < list.getLength(); i++) {
Node child = list.item(i);
listAllNode1(child);
}
}
//读取某个xml元素的内容
public static void readElement(Document document)
{
NodeList list= document.getElementsByTagName("书名");
Node node= list.item(0);
System.out.println(node.getTextContent());
}
//读取某个xml元素的属性
public static void readAttribute(Document document)
{
NodeList list= document.getElementsByTagName("书");
Node node= list.item(0);
NamedNodeMap map= node.getAttributes();
for(int i=0;i<map.getLength();i++)
{
Node attr = map.item(i);
System.out.println(attr.getNodeName()+"="+attr.getNodeValue());
}
}
//增加一个标签
public static void add(Document document) throws Exception
{
//首先要创建一个标签
Node node= document.createElement("售价");
node.setTextContent("39");
//把标签挂到根节点上去
Node price =document.getElementsByTagName("书").item(0);
price.appendChild(node);
//通过transformer方法把一个内存中的document写到文件中去
TransformerFactory factory= TransformerFactory.newInstance();
Transformer trans= factory.newTransformer();
trans.transform(new DOMSource(document) , new StreamResult(new File("src/book.xml")) );
}
//在中间创建一个标签
public static void add1(Document document) throws Exception
{
//首先要创建一个标签
Node node= document.createElement("作者");
node.setTextContent("AAA");
//把标签挂到根节点上去
Node author =document.getElementsByTagName("书").item(0);
author.insertBefore(node,document.getElementsByTagName("售价").item(0) );
//通过transformer方法把一个内存中的document写到文件中去
TransformerFactory factory= TransformerFactory.newInstance();
Transformer trans= factory.newTransformer();
trans.transform(new DOMSource(document) , new StreamResult(new File("src/book.xml")) );
}
//删除某个标签 。
public static void delete(Document document) throws Exception
{
//先找到要删除的节点
Node author= document.getElementsByTagName("作者").item(0);
//通过这个节点找到他的父亲节点,再通过父亲节点删除当前节点
author.getParentNode().removeChild(author);
//新建一个transformer工厂类
TransformerFactory factory= TransformerFactory.newInstance();
//通过transformer的一个静态方法得到transformer的一个实例类
Transformer trans= factory.newTransformer();
//transformer实例类有一个写的方法 把内存中的文件写到硬盘上 从source到result
trans.transform(new DOMSource(document) , new StreamResult(new File("src/book.xml")) );
}
//更改某个标签
public static void update(Document document) throws Exception
{
Node node= document.getElementsByTagName("书名").item(0);
node.setTextContent("数据结构");
TransformerFactory factory= TransformerFactory.newInstance();
Transformer trans= factory.newTransformer();
trans.transform(new DOMSource(document), new StreamResult(new File("src/book.xml")) );
}
//删除某个属性
public static void removeAttribute(Document document) throws Exception
{
Element element= (Element)document.getElementsByTagName("书").item(0);
element.removeAttribute("name");
TransformerFactory factory= TransformerFactory.newInstance();
//通过transformer的一个静态方法得到transformer的一个实例类
Transformer trans= factory.newTransformer();
//transformer实例类有一个写的方法 把内存中的文件写到硬盘上 从source到result
trans.transform(new DOMSource(document) , new StreamResult(new File("src/book.xml")) );
}
//增加某个属性
public static void addAttribute(Document document) throws Exception
{
Attr att= document.createAttribute("name");
att.setTextContent("AAA");
Element element= (Element)document.getElementsByTagName("书").item(0);
element.setAttributeNode(att);
TransformerFactory factory= TransformerFactory.newInstance();
//通过transformer的一个静态方法得到transformer的一个实例类
Transformer trans= factory.newTransformer();
//transformer实例类有一个写的方法 把内存中的文件写到硬盘上 从source到result
trans.transform(new DOMSource(document) , new StreamResult(new File("src/book.xml")) );
}
//更新某个属性
public static void updateAttribute(Document document) throws Exception
{
Element element= (Element)document.getElementsByTagName("书").item(0);
element.setAttribute("name", "bbb");
TransformerFactory factory= TransformerFactory.newInstance();
Transformer trans= factory.newTransformer();
trans.transform(new DOMSource(document), new StreamResult(new File("src/book.xml")));
}
}