当前位置:编程学习 > XML/UML >>

Java_xml_Dom解析实现增删改查

1.Node准备
Node接口是整个文档对象模型的主要数据类型,它表示该文档树中的单个节点。例如Attr, CharacterData, Comment, Text,Element都是Node的子类。 xml解析的误区: 在xml文件解析过程中,所有信息都被当做一个对象,例如解析下面的语句
[java] 
/* 
 * <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
[java] 
/** 
 * 解析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();  
    }  
}  
[java] 
/** 
 * 对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
补充:软件开发 , Java ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,