DOM,JAVA

来源:互联网 发布:三国志13 人物数据 编辑:程序博客网 时间:2024/06/05 07:31

1.DOM的介绍
2.DOM文档树模型
3.DOM六个基本接口
4.DOM访问节点
5.DOM创建XML文档
6.DOM修改XML节点


1.DOM介绍:

DOM 是Document Object Model 的缩写,即文档对象模型,是W3C组织推荐的处理XML的标准接口,定义了所有文档元素的对象和属性,以及访问它们的办法(接口)。

W3C DOM 分为三个不同的部分

核心DOM  用于任何结构文档的标准模型

XML DOM 用于XML文档的标准模型

HTML  DOM  用于HTML文档的标准模型




2.DOM 文档树模型


解析器会把XML文档加载到内存中,在内存中为XML文件建立逻辑形式的树,其中每个节点代表一个个可以与其交互的对象。


XML文档中的每个元素都是一个节点

DOM是这样规定的:

1每个文档是一个文档节点

2每个XML标记是一个元素节点

3包含在XML元素中的文本是文本节点

4每一个XML属性是一个属性节点

5注释属于注释节点


3.DOM基本接口

在DOM接口规范中,有4个基本接口:
1.Document:是对文档进行操作的入口,本节点是DOM树中的根节点。 
2.Node:代表DOM树中的一个节点 。 
3.NodeList:表示有顺序关系的一组节点。 
4.NamedNodeMap:通过名字来访问节点的集合。

1) Document接口

Document节点是DOM树的根节点,也即对XML 文档进行操作时的入口节点。

通过Document节点,可以访问到文档中的其他节点,如处理指令、注释、文档类型以及XML文档的根元素节点等。


2) Node接口

DOM接口中许多接口是从Node接口继承过来的,如 Element ,Attr 和 CDATASection等接口


3) NodeList接口

NodeList用于表示有顺序关系的一组节点。

DOM中的NodeList对象是活动的,即对文档的改变会直接反映到相关的NodeList对象中。

如:通过DOM获得一个NodeList对象,再通过DOM对Element节点进行增删改,这些变化就会自动反映到NodeList对象中

NodeList对象可以通过GetNodeByName获得


4) NamedNodeMap 接口

NameNodeMap表示的是一组和其唯一的名字的一一对应关系,该接口主要用在属性节点的表示上。

NameNodeMap对象也是活动的。


5) Element 接口

Element继承自Node接口

Element节点可以有Element子节点和Text子节点,若一个节点使用getNodeType()方法测试,返回值为Node。ELEMENT_NODE


6) Text 接口

通过getNodeType()返回,Node。TEXT_NODE

Element节点可以有Text节点和Element节点




4.DOM访问节点


xx.xml

<?xml version="1.0" encoding="utf-8" ?><books number="4"  tmp="tmptmptmp"><book id="id01" publisher="aa" ><name>第一本书</name><price>111</price></book><book id="id02" publisher="bb" ><name>第二本书</name><price>222</price></book><book id="id03" publisher="cc" ><name>第三本书</name><price>333</price></book><book></book></books>




package XML;import java.io.File;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.parsers.ParserConfigurationException;import org.w3c.dom.*;public class FORXML {//访问Attrpublic static void printAttr(NamedNodeMap map){if(map==null) return;System.out.println("----------------------------------------------------");for(int i=0;i<map.getLength();++i){Attr attrNodeAttr=(Attr)map.item(i);System.out.println("属性名为 :"+attrNodeAttr.getName()+"属性值为 :"+attrNodeAttr.getValue());}}
//访问Element节点
public static void printElement(Node root){NodeList children = root.getChildNodes();if(children.getLength()==1){//Text节点也算是子节点if(root.getNodeType()==Node.ELEMENT_NODE){Element curElement=(Element)root;System.out.println("节点--"+curElement.getNodeName() + "节点值--"+curElement.getTextContent());}return;}if(root.hasAttributes()){NamedNodeMap curNodeAttr = root.getAttributes();printAttr(curNodeAttr);}for(int i=0;i<children.getLength();++i){Node curNode=children.item(i);printElement(curNode);}}public static void main(String[] args) {try {DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();DocumentBuilder builder = factory.newDocumentBuilder();Document document = builder.parse(new File("xx.xml"));Element root = document.getDocumentElement();//获得XML的版本号System.out.println("XML的版本号为 :"+document.getXmlVersion());//获得XML的根节点System.out.println("XML的根节点叫做:"+root.getNodeName());//输出ElementprintElement(root);} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}}

5.DOM创建XML


结果如下:

<?xml version="1.0" encoding="UTF-8" standalone="no"?><books><book id="id-01"><name>第一本</name><price>11</price></book><book id="id-11"><name>第二本</name><price>22</price></book><book id="id-21"><name>第三本</name><price>33</price></book></books>



package createXML;import java.io.File;import java.io.FileOutputStream;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.parsers.ParserConfigurationException;import javax.xml.transform.OutputKeys;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 example {public static void main(String[] args) {String[]  booksName= {"第一本","第二本","第三本"};String[]  booksPrice= {"11","22","33"};try {DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();DocumentBuilder builder;builder = factory.newDocumentBuilder();//创建空的XML文档Document document = builder.newDocument();document.setXmlVersion("1.0");//创建并添加Element节点Element root = document.createElement("books");document.appendChild(root);for(int i=0;i<booksName.length;++i){root.appendChild(document.createElement("book"));}NodeList nodeList = document.getElementsByTagName("book");int size= nodeList.getLength();for(int i=0;i<size;i++){Node node = nodeList.item(i);if(node.getNodeType()==Node.ELEMENT_NODE){Element element = (Element) node;//添加Attrelement.setAttribute("id", "id-"+i+1);//为book节点添加子节点element.appendChild(document.createElement("name"));element.appendChild(document.createElement("price"));}}//为name节点添加Text子节点NodeList nodeList2 = document.getElementsByTagName("name");for(int i=0;i<size;i++){Node node = nodeList2.item(i);if(node.getNodeType()==Node.ELEMENT_NODE){Element element = (Element) node;element.appendChild(document.createTextNode(booksName[i]));}}NodeList nodeList3 = document.getElementsByTagName("price");for(int i=0;i<size;i++){Node node = nodeList3.item(i);if(node.getNodeType()==Node.ELEMENT_NODE){Element element = (Element) node;element.appendChild(document.createTextNode(booksPrice[i]));}}//将存在内存中的xml树转化成为xml文件输出TransformerFactory transformerFactory = TransformerFactory.newInstance();Transformer transformer = transformerFactory.newTransformer();//添加这一行保证换行transformer.setOutputProperty(OutputKeys.INDENT, "yes");DOMSource domSource = new DOMSource(document);File file=new File("example.xml");FileOutputStream out=new FileOutputStream(file);StreamResult xmlResult = new  StreamResult(out);transformer.transform(domSource, xmlResult);} catch (Exception e) {e.printStackTrace();}}}




6.DOM修改与删除节点

结果如下:


<?xml version="1.0" encoding="UTF-8" standalone="no"?><books><book><price>111111111111</price></book><book id="id-11"><name>第二本</name><price>22</price></book><book id="id-21"><name>第三本</name><price>33</price></book></books>


package createXML;import java.io.File;import java.io.FileOutputStream;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.parsers.ParserConfigurationException;import javax.xml.transform.OutputKeys;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 example {public static void main(String[] args) {String[]  booksName= {"第一本","第二本","第三本"};String[]  booksPrice= {"11","22","33"};try {DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();DocumentBuilder builder;builder = factory.newDocumentBuilder();Document document = builder.parse(new File("example.xml"));Element root=document.getDocumentElement();NodeList nodeList = document.getElementsByTagName("book");NodeList nameNodeList = document.getElementsByTagName("name");NodeList priceNodeList = document.getElementsByTagName("price");Element firstBookElement = (Element) nodeList.item(0);//删除第一本书的属性firstBookElement.removeAttribute("id");//删除第一本书下的第一个子节点firstBookElement.removeChild(nameNodeList.item(0));//修改Text节点priceNodeList.item(0).setTextContent("111111111111");TransformerFactory transformerFactory = TransformerFactory.newInstance();Transformer transformer = transformerFactory.newTransformer();transformer.setOutputProperty(OutputKeys.INDENT, "yes");DOMSource domSource = new DOMSource(document);File file=new File("example_update.xml");FileOutputStream out=new FileOutputStream(file);StreamResult xmlResult = new  StreamResult(out);transformer.transform(domSource, xmlResult);} catch (Exception e) {e.printStackTrace();}}}


0 0
原创粉丝点击