5. DOM解析XML
DOM解析模型:
DOM是以层次结构组织的节点或信息的片段集合,是XML数据的一种树形表示。
文档中所有的元素、属性、文本都会被解析成Node节点。
Jaxp中的DOM代码实现思路:
工厂类->解析器->解析器解析XML返回Document
1 //解析器工厂类 2 DocumentBuilderFactory builderFactory=DocumentBuilderFactory.newInstance( ); 3 //解析器类 4 DocumentBuilder builder = builderFactory.newDocumentBuilder( ); 5 //解析生成Document对象 6 Document doc = builder.parse("xxx.xml"); 7 //通过Document对象拿到Node节点
节点Node与元素Element:
通过查看Node源码,发现Node接口里面有很多静态变量,用于定义此节点是什么类型的。
注意:
父类是节点Node,子类是元素Element
Element 接口 继承了 Node接口
Document 接口 继承了 Node接口
常用方法:
通过ID获取元素:
doc.getElementById( ) 必须使用DTD声明ID属性
doc.getElementsByTagName( ) 返回NodeList集合
注意:
使用id获取元素时,必须要保证DTD约束属性为ID,
属性名字并非要取id,可以随意命名。
而不是元素中定义一个id名字的属性。
getNodeName( ) 返回节点的名称
getNodeType( ) 返回节点的类型
getNodeValue( ) 返回节点的值
getTextContent( ) 返回此节点及其后代的文本内容
getAttributes( ) 返回属性集
通过标签获取Node节点:
NodeList list = document.getElementsByTagName("book");
int len = list.getLength();
Node node= list.item(0); 获取一则数据
System.out.println(node);
属性节点:
NamedNodeMap nnm=node.getAttributes();
int length=nnm.getLength();
Node att=nnm.item(0);
属性节点的,getNodeValue( ),getTextContent( )返回的值相同,
在XML中属性可以写到子标签中,Value就是Text
DOM的增删改查:
1.查询所有节点:
NodeList list =document.getChildNodes();
这个方法会把节点下面的直接子节点返回,包括结束节点。
因为Node有几个静态常量来代表节点类型,结束节点也是一种类型。
空格也算一个文本节点。
利用递归,打印出所有的节点。
1 public void showAll() throws Exception{ 2 DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance(); 3 DocumentBuilder builder = builderFactory.newDocumentBuilder(); 4 Document document = builder.parse("bookstore.xml"); 5 printAll(document); 6 System.out.println("---------------------"); 7 NodeList list = document.getChildNodes(); 8 for (int i = 0; i < list.getLength(); i++) { 9 //会把每个结束节点也打印出来,包括每个元素的结束节点。 10 System.out.println(list.item(i).getNodeName()); 11 } 12 } 13 14 //递归 15 public void printAll(Node node){ 16 //增加if判断,就不会打印出结束节点了 17 if(node.getNodeType()==Node.DOCUMENT_NODE){ 18 System.out.println("文档节点-"+node.getNodeName()); 19 }else if(node.getNodeType()==Node.ELEMENT_NODE){ 20 System.out.println("元素节点-"+node.getNodeName()); 21 if(node.hasAttributes()){ 22 NamedNodeMap list = node.getAttributes(); 23 for (int i = 0; i < list.getLength(); i++) { 24 Node attNode = list.item(i); 25 System.out.println("属性节点-"+attNode.getNodeName()+"-V-"+attNode.getNodeValue()); 26 } 27 } 28 } 29 //这里要注意,在XML中空格和换行也算文本节点 30 else if(node.getNodeType()==Node.TEXT_NODE){ 31 System.out.println("文本节点-"+node.getTextContent()); 32 } 33 else if(node.getNodeType()==Node.COMMENT_NODE){ 34 System.out.println("注释-"+node.getNodeValue()); 35 } 36 if(node.hasChildNodes()){ 37 NodeList nodeList = node.getChildNodes(); 38 for (int i = 0; i < nodeList.getLength(); i++) { 39 Node childNode = nodeList.item(i); 40 printAll(childNode); 41 } 42 } 43 }
2. 修改XML文件
Transform:
javax.xml.transform 包中的 Transformer 类
用于把代表 XML 文件的 Document 对象转换为某种格式后进行输出
例如把 Document 对象又重新写入到一个XML文件中
1 //把name节点的文本修改为Android 2 nameNode.setTextContent("Android"); 3 //回写document 4 TransformerFactory transformFac =TransformerFactory.newInstance(); 5 Transformer transformer = transformFac.newTransformer(); 6 //transform方法需要两个参数,传递节点和流。 7 transformer.transform(new DOMSource(document),new StreamResult(new File("bookstore.xml")));
3. 添加元素到XML
1 public void add() throws Exception { 2 //获取解析XML工厂对象,此处省略.... 3 // 获取根元素 4 Node node = document.getElementsByTagName("books").item(0); 5 // 创建各种元素,属性 6 Element bookEle = document.createElement("book"); 7 Attr idAttr = document.createAttribute("id"); 8 // 两种设置属性的方法,都可以 9 idAttr.setNodeValue("newBook1"); // Node的方法 10 // idAttr.setValue("newBook2"); // Attr的方法 11 Element name = document.createElement("name"); 12 name.setTextContent("装B大全"); 13 Element price = document.createElement("price"); 14 price.setTextContent("¥9.9"); 15 // 把创建好的添加到doc 16 // 添加属性用set,不是append 17 bookEle.setAttributeNode(idAttr); 18 bookEle.appendChild(name); 19 bookEle.appendChild(price); 20 node.appendChild(bookEle); 21 TransformerFactory transformFac =TransformerFactory.newInstance(); 22 Transformer transformer = transformFac.newTransformer(); 23 //transform方法需要两个参数,传递节点和流。 24 transformer.transform
(new DOMSource(document),new StreamResult(new File("bookstore.xml")); 26 }
4. 删除
删除操作,需要用到删除节点的父节点
利用 root.removeChild(element) 删除
1 //获取doc,省略代码..... 2 //删除指定id元素 3 Node root = document.getElementsByTagName("books").item(0); 4 Element element = document.getElementById("book_code_1"); 5 root.removeChild(element); 6 //Transform 回写到XML,省略代码.....
注意:Transform 在回写时,会把原来XML文件的DTD约束清除。
浙公网安备 33010602011771号