欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-07-05 21:50:05
...

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

有student.xml:

<?xml version="1.0" encoding="GB2312"?>

<result>

<class name="1">

         <student id="1">

            <name>龙准</name>

            <age>25</age>

         </student>

         <student id="2">

            <name>龙准2</name>

            <age>25</age>

         </student>

<student id="3">

            <name>龙准3</name>

            <age>25</age>

         </student>

</class>

<class name="2">

         <student id="1">

            <name>廖丽1</name>

            <age>25</age>

         </student>

         <student id="2">

            <name>廖丽2</name>

            <age>25</age>

         </student>

</class>

</result>

解析代码如下:

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<cls.getLength();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文档


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE book SYSTEM "D:\workspace\XML\WebRoot\WEB-INF\book.dtd">
<book>
<bookname name="XML详解" font="GB2312"></bookname>
<authors>
<author name="张孝祥" sex="男" age="45"></author>
<author name="王勇" sex="男" age="35"></author>
<author name="王波" sex="男" age="30"></author>
</authors>
<price value="¥55"></price>
<publishdate>
<value>2009-08-18</value>
</publishdate>
</book>

 

 

 

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<authors.getLength();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<attr.getLength();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解析(超全)---(二)
            
    
    博客分类: XML XMLF# 原创
 

  • xml解析(超全)---(二)
            
    
    博客分类: XML XMLF# 
  • 大小: 5.2 KB
相关标签: XML F#