xml解析(超全)---(二)

阅读更多

在用DOM解析一个比较复杂点的xml文件

有student.xml:

        

            龙准

            25

        

        

            龙准2

            25

        

            龙准3

            25

        

        

            廖丽1

            25

        

        

            廖丽2

            25

        

解析代码如下:

File file=new File("D://student.xml");

DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();

DocumentBuilder builder=factory.newDocumentBuilder();

Document docment=builder.parse(file);

Element root=docment.getDocumentElement();

NodeList nl=root.getElementsByTagName("class");

System.out.println("总共有"+nl.getLength()+"个班级");

//得到节点的子节点

NodeList cls=root.getChildNodes();

for(int h=0;h

        Node classes=cls.item(h);

        if(classes.getNodeType()==Node.ELEMENT_NODE){

   //取得节点的属性值
//注意,节点的属性也是它的子节点。它的节点类型也是Node.ELEMENT_NODE

            String name=classes.getAttributes().

getNamedItem("name").getNodeValue();

            System.out.println("班级:"+name);

            System.out.println("=======");

    //轮循子节点

            for(Node node=classes.getFirstChild();node!=null;node=node.getNextSibling()){

            if(node.getNodeType()==Node.ELEMENT_NODE){

                if(node.getNodeName().equals("student")){

                    String id=node.getAttributes().getNamedItem("id")

.getNodeValue();

                    System.out.println("学生ID:"+id);

                    for(Node node1=node.getFirstChild();node1!=null;node1=node1.getNextSibling()){

                    if(node1.getNodeType()==Node.ELEMENT_NODE){

                        if(node1.getNodeName().equals("name")){

                        System.out.println("学生姓名:"+node1.getFirstChild().getNodeValue());

                        }

                    if(node1.getNodeName().equals("age")){

                        System.out.println("学生年龄:"+node1.getFirstChild().getNodeValue());

                    }

            }

        }

    }

}

}

}

}

打印结果:

总共有2个班级

班级:1

=======

学生ID:1

学生姓名:龙准

学生年龄:25

学生ID:2

学生姓名:龙准2

学生年龄:25

学生ID:3

学生姓名:龙准3

学生年龄:25

班级:2

=======

学生ID:1

学生姓名:廖丽1

学生年龄:25

学生ID:2

学生姓名:廖丽2

学生年龄:25

 

 

DOM+xpath解析XML文档













2009-08-18

 

 

 

try {
//读取book.xml到内存
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder dbd = dbf.newDocumentBuilder();
Document doc = dbd.parse(

new FileInputStream("D: \\book.xml"));

//通过XML获得book的authors的author子节点列表
XPathFactory f = XPathFactory.newInstance();
XPath path = f.newXPath();
NodeList authors= (NodeList) path.evaluate(

"book/authors/author", doc,XPathConstants.NODESET);
System.out.println(authors.getLength());
//遍历取到的元素
if(authors!=null){
   for(int i=0;i   Node author = authors.item(i);
   int n = i + 1;
   System.out.print(n+". 名字:"+author.getNodeName());
   System.out.println();
  }
}

//获得book的authors的第一个子节点,注意NODESET和NODE的区别
Node author= (Node) path.evaluate("book/authors/author", doc,XPathConstants.NODE);
System.out.println(" 名称:"+author.getNodeName());
System.out.println(" 内容:"+author.getTextContent());//如果存在内容则返回内容,不存在则返回空
//获取节点的属性
NamedNodeMap attr = author.getAttributes();
System.out.println(" 该节点的属性个数"+attr.getLength());
//遍历元素的属性
if(attr!=null){
  for(int i=0;i    int n = i + 1;
    System.out.print(" 属性"+n+" 名称:"+attr.item(i).getNodeName());
    System.out.print(" 值:"+attr.item(i).getNodue());
    System.out.print(" 类型:"+attr.item(i).getNodeType());
    System.out.println();
 }
}

} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (XPathExpressionException e) {
e.printStackTrace();
}
}
}

DOM的增删改

 

以第一个xml文档为例:

新增一个user节点:

Element eleUser=doc.createElement(“user”);

Element eleName=doc.createElement(“name”);

Element eleAge=doc.createElement(“age”);

 

Text nametext=doc.createTextNode(“new龙准”);

Text agetext=doc.createTextNode(“23”);

 

eleName.appendChild(nametext);

eleAge.appendChild(agetext);

 

eleUser.appendChild(eleName);

eleUser.appendChild(eleAge);

eleUser.setAttribute(“id”,”3”);

 

Element root=doc.getDocumentElement();

Root.appendChild(eleUser);

删除第一个user

NodeList users=root.getElementByTagName(“user”);

Root.removeChild(users.item(0));

修改第一个user的age值

Element e=root.getElementByTagName(“user”).item(0);

Node age=e.getElementByTagName(“age”).item(0);

Age.getFirstNode.setNodeValue=”24”;

 

以上操作全在内存中,并没有持久化到文件,如果需要持久化到文件需要用到transformerFactory

TransformerFactory transformerfactory=TransformerFactory.newInstance();

Tansformer transformer=transformerfactory.newTransformer();

//设置编码字符集

Transformer.setOutPutProperty(“encoding”,”utf-8”);

//获取源数据对象

DOMSource source=new DOMSource(doc);

//设置目标对象

File ff=new File(“d://2.xml”);

If(!ff.isexists){

       ff.createNewFile();

}

StreamResult sr=new StreamResult(ff);

transformer..transform(source,sr);

 

Xpath的详细介绍请看Xpath的pdf文档

DOM的相关操作到此为止,把以上所讲多练习,DOM操作xml文档就没问题了


xml解析(超全)---(二)_第1张图片原创
 

  • xml解析(超全)---(二)_第2张图片
  • 大小: 5.2 KB
  • 查看图片附件

你可能感兴趣的:(XML,F#)