zoukankan      html  css  js  c++  java
  • Java_xml_Dom解析方式

    1.Node准备

    Node接口是整个文档对象模型的主要数据类型,它表示该文档树中的单个节点。例如Attr, CharacterData, Comment, Text,Element都是Node的子类。 xml解析的误区: 在xml文件解析过程中,所有信息都被当做一个对象,例如解析下面的语句

    /*
     * <book>AAA<name>java语法</name>BBB</book>
     * 该book下的直接子节点有3个,AAA和BBB被解析为CharacterData类型的节点,<name>被解析为Element类型的节点,
     * 
     * <book> <name>java语法</name> </book>
     * 该book下的直接子节点有3个,由于在<name>之前有个换行,CharacterData类型的节点
     * <book><name>java语法</name></book> 该book下的直接子节点只有1个
     */

    2.Dom解析优缺点

    优点:整个文档读入内存,方便操作:支持修改、删除和重现排列等多种功能。

    缺点:将整个文档读入内存中,保留了过多的不需要的节点,浪费内存和空间。

    3.Dom解析xml

    /**
     * 解析xml文件,遍历并所有信息
     */
    public static void parseXMl() {
    	try {
    	// 1.通过DocumentBuilder工厂得到对应的xml解析器
    		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    		DocumentBuilder builder = factory.newDocumentBuilder();
    
    	// 2.通过解析器得到Document对象
    		Document doc = builder.parse("d:/my.xml");
    		
    	// 3.解析数据
    	/*
    	 * <book>
    	 * 		<name>javaWeb</name>
    	 * 		<author>fanglx</author> 
    	 * 		<price>30.90</price> 
    	 * </book>
    	 */
    		//得到所有的book的标签的nodelist
    		NodeList nodeList = doc.getElementsByTagName("book");
    		//遍历每个book节点
    		for(int i=0; i<nodeList.getLength(); i++){
    			Node node = nodeList.item(i);	//当前遍历的book节点
    			//得到该book节点下的所有的直接子节点
    			NodeList childNodes = node.getChildNodes();
    			for(int j=0; j<childNodes.getLength(); j++){
    				Node childNode = childNodes.item(j);
    				//如果当前的childNode节点是一个标签,CharacterData类型的文本节点则不执行
    				if(childNode instanceof Element){	
    					String fieldName = childNode.getNodeName();	//当前节点名称 比如author
    					String value = childNode.getTextContent();	//当前节点的text值比如fanglx
    					/*
    					 * 或者下面方式得到value值
    					 * String value = childNode.getFirstChild().getNodeName();//fanglx
    					 */
    					System.out.println(fieldName+"="+value);	//author=fanglx
    				}
    			}
    		}
    	} catch (Exception e) {
    		e.printStackTrace();
    	}
    }
    /**
     * 对xml文件的更新
     */
    public static void updateXMl() {
    	try {
    	// 1.通过DocumentBuilder工厂得到对应的xml解析器
    		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    		DocumentBuilder builder = factory.newDocumentBuilder();
    		
    	// 2.通过解析器得到Document对象
    		Document doc = builder.parse("d:/my.xml");
    	
    	// 3.更新数据
    	/*
    	 * <book>
    	 * 		<name>javaWeb</name>
    	 * 		<author>fanglx</author> 
    	 * 		<price>30.90</price> 
    	 * </book>
    	 */
    		NodeList nodeList = doc.getElementsByTagName("book");
    		Element parentEle = (Element) nodeList.item(0);
    		
    		//直接在子标签的尾部增加<num id="1001">25</num>
    		Element childEle = doc.createElement("num");
    		childEle.setAttribute("id", "1001");//设置属性
    		childEle.setTextContent("25");		//设置值	
    		parentEle.appendChild(childEle);
    		
    		//直接在price标签前面增加<age id="25">mm</age>
    		Element newChild = doc.createElement("age");
    		newChild.setAttribute("id", "25");	//设置属性
    		newChild.setTextContent("mm");		//设置值
    		Element refChild = (Element) parentEle.getElementsByTagName("price").item(0);
    		parentEle.insertBefore(newChild, refChild);
    		
    	// 4.保存更新的数据
    		TransformerFactory tFactory = TransformerFactory.newInstance();
    		Transformer transformer = tFactory.newTransformer();
    		transformer.transform(new DOMSource(doc), new StreamResult(new File("c:/my.xml")));
    	} catch (Exception e) {
    		e.printStackTrace();
    	}
    }
    <?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <books>   
    	<book>   
    		<name>javaWeb</name>    
    		<author>fanglx</author>
    		<price>30.90</price>      
    	</book>
    </books>
  • 相关阅读:
    常见浏览器的兼容问题
    SCSS 的理解
    常见浏览器兼容性问题与解决方案(上)
    常见浏览器兼容性问题与解决方案(下)
    ie6定位absolute bug触发layout解决
    AngularJS 最常用的八种功能
    IE6的3像素bug
    CSS属性级Hack
    什么是SASS
    什么是less?
  • 原文地址:https://www.cnblogs.com/james1207/p/3343337.html
Copyright © 2011-2022 走看看