在用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(eXtensible Markup Language)是一种用于标记数据的语言,它是HTML(超文本标记语言)的一个扩展,旨在传输和存储数据。本教程将深入探讨XML的基本概念、语法、解析方式以及在实际应用中的作用。 XML的设计...
4. XML解析: - DOM(Document Object Model):将整个XML文档加载到内存中,形成一棵节点树,便于遍历和操作。 - SAX(Simple API for XML):事件驱动的解析方式,逐行读取XML,只在需要时处理特定事件,适用于...
在提供的"范春梅-XML基础教程源码-code"中,你可以找到关于XML处理的实例代码,可能包括创建、解析、修改XML文档等操作。通过这些源码,你可以更好地理解XML在实际开发中的应用。 总之,XML作为一种数据交换和存储...
Java中的XML解析技术是开发过程中不可或缺的一部分,尤其是在处理结构化数据时。XML(eXtensible Markup Language)因其可扩展性和灵活性,常被用于存储和交换数据。在Java中,有四种主要的XML解析技术,它们分别是...
1. **解析器**:XML解析器读取XML文档并将其转化为内存中的对象模型,如DOM(文档对象模型)或SAX(简单API for XML)。 2. **DOM**:将整个XML文档加载到内存,形成一个树形结构,方便遍历和操作。 3. **SAX**:...
oracle过程解析XML,支持超4000,并很方便的 . 出结果 oracle过程解析XML,支持超4000 oracle过程解析XML,支持超4000
本资源"iPhone iOS XML解析源代码"提供了一个深入学习和比较XML解析技术的实例,包含两种不同的解析方法,旨在帮助开发者了解它们的性能差异。 首先,我们来探讨第一种解析方式:NSXMLParser。这是Apple提供的内置...
HTTP XML文件解析是网络通信中常见的一种技术,它结合了HTTP协议和XML(可扩展标记语言)的数据格式,广泛应用于Web服务、API交互以及数据交换等领域。本文将深入探讨在线解析HTTP XML文件的相关知识点,包括HTTP...
在实际应用中,根据需求和性能考虑,可以选择合适的XML解析库和方法。例如,如果需要频繁修改XML文档,DOM可能更适合;如果处理大型XML文件,SAX或StAX会是更好的选择。结合这些库,可以高效地进行XML的读写、查询和...
在IT行业中,网络通信是至关重要的部分,而HTTP...理解HTTP协议的工作原理,掌握WinInet的API用法,以及熟悉XML解析库的使用,对于开发涉及网络通信的C++应用程序至关重要。通过实践,你可以更好地理解和掌握这些技能。
pugixml, 带有XPath支持的C++的轻量级简单和快速XML解析器 pugixml pugixml是一个 C++ XML处理库,由具有丰富遍历/修改功能的DOM和基于XML的超快速XML解析器组成,用于构造XML树和复杂的数据驱动树查询的XPath 1.0...
XML 解析器原理及性能比较 XML 解析器是指将 XML 文档转换为计算机可以理解的格式的软件组件。常见的 XML 解析器有 DOM、SAX、JDOM 和 DOM4J 等。每种解析器都有其特点和优缺,选择合适的解析器对应用程序的性能和...
XML超酷页面效果二.htm文件很可能是这个压缩包的核心,它演示了如何通过JavaScript解析和操作XML文档,来创建动态和引人入胜的网页。在网页设计中,利用XML可以将数据与显示分离,使得数据更易于管理和更新,而...
2. **数据解析**:HTML5页面通过JavaScript来解析XML文件,将数据加载到内存中,并显示在界面上。DOM(Document Object Model)API是用于处理XML和HTML文档的标准接口,可用于遍历和操作XML节点。 3. **用户界面**...
2. **解析XML**:获取到XML响应后,我们可以使用DOM方法如getElementsByTagName、getElementById、getAttribute等来查找和提取XML节点信息。例如,获取所有`<effect>`标签: ```javascript var effects = xmlDoc....
可以使用XML解析库,如Python的`xml.etree.ElementTree`,Java的`javax.xml.parsers.DocumentBuilderFactory`,或者JavaScript的`DOMParser`。这些库提供了解析XML文档,查找特定元素,以及提取和修改数据的功能。 ...
- XML解析器负责解析XML文档,确保其符合XML标准。 - **1.3.3 浏览器和其他工具** - 大多数现代浏览器支持XML,并能直接显示或通过样式表呈现XML文档。 - **1.3.4 处理过程总结** - XML文档的处理通常涉及创建、...
这篇文档将围绕着标题中提到的六个关键技术领域——CSS(层叠样式表)、DHTML(动态超文本标记语言)、XMLDOM(XML文档对象模型)、T-SQL(Transact-SQL)、XPath(XML路径语言)以及正则表达式,展开详细的阐述。...
7. **解析与验证**:XML文档可以被解析器读取,解析器可以是DOM(文档对象模型)、SAX(简单API for XML)或StAX(流式API for XML)。验证器则检查文档是否符合其DTD或Schema。 8. **XPath与XSLT**:XPath是查询...