`
longzhun
  • 浏览: 372008 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

    博客分类:
  • XML
阅读更多

在用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文档就没问题了


原创
 

  • 大小: 5.2 KB
分享到:
评论

相关推荐

    xml教程------

    XML(eXtensible Markup Language)是一种用于标记数据的语言,它是HTML(超文本标记语言)的一个扩展,旨在传输和存储数据。本教程将深入探讨XML的基本概念、语法、解析方式以及在实际应用中的作用。 XML的设计...

    XML资料大全--基础 语言 笔记课件

    4. XML解析: - DOM(Document Object Model):将整个XML文档加载到内存中,形成一棵节点树,便于遍历和操作。 - SAX(Simple API for XML):事件驱动的解析方式,逐行读取XML,只在需要时处理特定事件,适用于...

    XML基础教程源码-code

    在提供的"范春梅-XML基础教程源码-code"中,你可以找到关于XML处理的实例代码,可能包括创建、解析、修改XML文档等操作。通过这些源码,你可以更好地理解XML在实际开发中的应用。 总之,XML作为一种数据交换和存储...

    Java中四种XML解析技术

    Java中的XML解析技术是开发过程中不可或缺的一部分,尤其是在处理结构化数据时。XML(eXtensible Markup Language)因其可扩展性和灵活性,常被用于存储和交换数据。在Java中,有四种主要的XML解析技术,它们分别是...

    XML---编程宝典

    1. **解析器**:XML解析器读取XML文档并将其转化为内存中的对象模型,如DOM(文档对象模型)或SAX(简单API for XML)。 2. **DOM**:将整个XML文档加载到内存,形成一个树形结构,方便遍历和操作。 3. **SAX**:...

    oracle过程解析XML,支持超4000

    oracle过程解析XML,支持超4000,并很方便的 . 出结果 oracle过程解析XML,支持超4000 oracle过程解析XML,支持超4000

    iPhone IOS XML解析源代码

    本资源"iPhone iOS XML解析源代码"提供了一个深入学习和比较XML解析技术的实例,包含两种不同的解析方法,旨在帮助开发者了解它们的性能差异。 首先,我们来探讨第一种解析方式:NSXMLParser。这是Apple提供的内置...

    在线解析HTTP XML文件

    HTTP XML文件解析是网络通信中常见的一种技术,它结合了HTTP协议和XML(可扩展标记语言)的数据格式,广泛应用于Web服务、API交互以及数据交换等领域。本文将深入探讨在线解析HTTP XML文件的相关知识点,包括HTTP...

    XML解析 XML操作

    在实际应用中,根据需求和性能考虑,可以选择合适的XML解析库和方法。例如,如果需要频繁修改XML文档,DOM可能更适合;如果处理大型XML文件,SAX或StAX会是更好的选择。结合这些库,可以高效地进行XML的读写、查询和...

    C++实现http的post发送接收数据以及xml解析

    在IT行业中,网络通信是至关重要的部分,而HTTP...理解HTTP协议的工作原理,掌握WinInet的API用法,以及熟悉XML解析库的使用,对于开发涉及网络通信的C++应用程序至关重要。通过实践,你可以更好地理解和掌握这些技能。

    pugixml, 带有XPath支持的C++的轻量级简单和快速XML解析器.zip

    pugixml, 带有XPath支持的C++的轻量级简单和快速XML解析器 pugixml pugixml是一个 C++ XML处理库,由具有丰富遍历/修改功能的DOM和基于XML的超快速XML解析器组成,用于构造XML树和复杂的数据驱动树查询的XPath 1.0...

    XML的四种解析器(dom,sax,jdom,dom4j)原理及性能比较,超详细

    XML 解析器原理及性能比较 XML 解析器是指将 XML 文档转换为计算机可以理解的格式的软件组件。常见的 XML 解析器有 DOM、SAX、JDOM 和 DOM4J 等。每种解析器都有其特点和优缺,选择合适的解析器对应用程序的性能和...

    javascript经典特效---XML超酷页面效果二.rar

    XML超酷页面效果二.htm文件很可能是这个压缩包的核心,它演示了如何通过JavaScript解析和操作XML文档,来创建动态和引人入胜的网页。在网页设计中,利用XML可以将数据与显示分离,使得数据更易于管理和更新,而...

    xml-5-lucky-draw.rar_lucky

    2. **数据解析**:HTML5页面通过JavaScript来解析XML文件,将数据加载到内存中,并显示在界面上。DOM(Document Object Model)API是用于处理XML和HTML文档的标准接口,可用于遍历和操作XML节点。 3. **用户界面**...

    javascript经典特效---XML超酷页面效果一.rar

    2. **解析XML**:获取到XML响应后,我们可以使用DOM方法如getElementsByTagName、getElementById、getAttribute等来查找和提取XML节点信息。例如,获取所有`&lt;effect&gt;`标签: ```javascript var effects = xmlDoc....

    全国省市地超全XML文件

    可以使用XML解析库,如Python的`xml.etree.ElementTree`,Java的`javax.xml.parsers.DocumentBuilderFactory`,或者JavaScript的`DOMParser`。这些库提供了解析XML文档,查找特定元素,以及提取和修改数据的功能。 ...

    XML实用大全(绝对经典)

    - XML解析器负责解析XML文档,确保其符合XML标准。 - **1.3.3 浏览器和其他工具** - 大多数现代浏览器支持XML,并能直接显示或通过样式表呈现XML文档。 - **1.3.4 处理过程总结** - XML文档的处理通常涉及创建、...

    CSS、DHTML、XMLDOM、T-SQL、XPath、正则表达式等.chm文件帮助文档

    这篇文档将围绕着标题中提到的六个关键技术领域——CSS(层叠样式表)、DHTML(动态超文本标记语言)、XMLDOM(XML文档对象模型)、T-SQL(Transact-SQL)、XPath(XML路径语言)以及正则表达式,展开详细的阐述。...

    无废话XML---劳虎

    7. **解析与验证**:XML文档可以被解析器读取,解析器可以是DOM(文档对象模型)、SAX(简单API for XML)或StAX(流式API for XML)。验证器则检查文档是否符合其DTD或Schema。 8. **XPath与XSLT**:XPath是查询...

Global site tag (gtag.js) - Google Analytics