2.1、课程的主要知识点
1、 RMI程序设计
2.2、本次预计讲解的知识点
1、 了解DTD的基本语法
2、 熟练应用XML解析:DOM、SAX、JDOM
3、具体内容
3.1、认识XML
XML:可扩展的标记性语言,本身可以扩充标记。
标记:在HTML中的<h1>、<h2>都属于标记,但是这些在HTML中的标记都是固定的,但是在XML中所有的标记都将由用户自己定义。
HTML与XML都属于标记性语言,两者实际上都来源于最早的SGML语言。例如,以下使用两种风格的代码来表示一个电话本的页面:
例如:使用HTML表示:
<html>
<head><title>html</title></head>
<body>
<ul>
<li>zhangsan
<ul>
<li>123456
<li>234567
<li>345678
</ul>
</ul>
</body>
</html>
以上的程序代码已经表现出了一个电话本。但是以上的所有标记都没有明确的表示出来一个信息的具体作用。HTML只是通过标记把内容显示出来了。此时,如果使用XML则,代码形式如下:
例如:使用XML表示
<?xml version="1.0"?>
<notepad>
<person>
<name>zhangsan</name>
<tels>
<tel>123456</tel>
<tel>234567</tel>
<tel>345678</tel>
</tels>
</person>
</notepad>
从以上的程序中可以很方便的看出那个元素表示的是姓名,那个元素表示的是电话。
HTML中的标记主要功能是用来显示内容
XML中的标记主要内容是用来表示数据的结构。在数据的交换或通讯上使用较多。
在XML文件中编写也是有其严格的要求的,XML文件的组成部分:
1、 前导区:
• 指的是使用<?xml ?>声明的部分,例如:
<?xml version="1.0"?>
以上的代码就使用了前导区的声明,在此处必须声明XML的版本,版本现在有且只有1.0。在声明的部分还可以指定本文件的编码。
<?xml version="1.0" encoding="GBK"?>
2、 数据区
对于XML文件来说,数据区中的所有元素里必须存在一个根节点。
所有的元素都必须完结。或写成空元素
标记的名称可以是中文。
<?xml version="1.0" encoding="GBK"?>
<通讯录>
<人员>
<姓名>张三</姓名>
<电话号码>
<电话>123456</电话>
<电话>234567</电话>
<电话>345678</电话>
</电话号码>
</人员>
</通讯录>
3、 可以在XML中引入CSS样式
demo04.css:
name{
font-weight:bold;
font-size:14px;
color:#990000;
line-height:17px;
}
tel{
font-size:12px;
color:#666666;
line-height:17px;
}
demo04.xml:
<?xml version="1.0" encoding="GBK"?>
<?xml-stylesheet type="text/css" href="demo04.css"?>
<notepad>
<person>
<name>张三</name>
<tels>
<tel>123456</tel>
<tel>234567</tel>
<tel>345678</tel>
</tels>
</person>
</notepad>
也可以为XML中的每一个标记增加若干个属性。属性必须使用“"”括起来。
<?xml version="1.0" encoding="GBK"?>
<notepad>
<person id="001">
<name>张三</name>
<tels>
<tel>123456</tel>
<tel>234567</tel>
<tel>345678</tel>
</tels>
</person>
</notepad>
以上的id就属于person中的一个属性,对于XML文件来说,一个内容是定义成属性或是元素本身没有任何的区别,如果数据需要被显示出来的话,则一般都会定义成元素(标记),而如果不需要显示的,则一般都会将其定义成属性。
在XML中对于以下的元素是有特殊意义的:>、<、"、'、&,如果现在要在XML元素的内容中出现以上的符号,则代码必须进行转义。进行实体参照,具体的对应列表如下:
No. 对应字符 实体参照名称
1 < <
2 > >
3 " "
4 ' '
5 & &
例如:以下使用了实体参照进行数据的显示
<?xml version="1.0" encoding="GBK"?>
<notepad>
<person id="001">
<name>张三</name>
<book><<java基础>></book>
</person>
</notepad>
在XML中也是支持注释操作的,存在两种注释:
• <!-- 注释内容 -->:HTML风格的注释
• 是直接使用CDATA标记声明的注释
CDATA注释:
<![CDATA[ 注释内容 ]]>
使用注释:
<?xml version="1.0" encoding="GBK"?>
<notepad>
<person id="001">
<name>张三</name>
<book><<java基础>></book>
<![CDATA[
":"""""^&%%##$%^$@^$@#^<><><><><>@##@#@!$#@""''''&&&&
]]>
</person>
</notepad>
3.2、XML解析(绝对重点)
DOM和SAX都是一种解析的标准。
程序 解析的标准 XML文件
3.2.1、DOM解析
DOM操作中所有的内容首先必须形成一张完整的DOM树,否则是无法解析的。那么就意味着,DOM解析操作中是要将全部的XML文件内容都读取进来的。
<?xml version="1.0" encoding="gb_2312" ?>
<addressbook>
<person sex="male">
<name>张三</name>
<email>zhs@xml.net.cn</email>
</person>
<person sex="male">
<name>李四</name>
<email>ls@xml.net.cn</email>
</person>
</addressbook>
以上的文挡如果要使用DOM解析,则会首先形成如下的DOM树:
在DOM中所有的内容全都是节点,连文字本身也是一个节点。
例如:给出以下的XML文档
<?xml version="1.0"?>
<people>
<person>zhangsan</person>
</people>
将以上文档中的里面的内容读取出来。
DOM操作的流程:
1、 建立DocumentBuilderFactory
2、 建立DocumentBuilder
3、 建立Document
4、 建立节点集合:NodeList
5、 循环进行XML解析
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
public class DOMDemo01 {
public static void main(String[] args) throws Exception{
// 1、建立DocumentBuilderFactory
DocumentBuilderFactory factory = null ;
factory = DocumentBuilderFactory.newInstance() ;
// 2、建立DocumentBuilder
DocumentBuilder builder = factory.newDocumentBuilder() ;
// 3、建力Document,将整个XML文档形成DOM树
Document doc = builder.parse("e:\\demo.xml") ;
NodeList nl = doc.getElementsByTagName("person") ;
System.out.println(nl.item(0).getFirstChild().getNodeValue());
}
}
NodeList一开始找的是person节点,但是在一个XML文件之中可能同时包含多个person节点,所以里面的item(0)就表示找到第一个person节点,之后在找到第一个person节点中的第一个子节点(文本节点)再求出里面的内容。
在以上的程序做进一步的扩展应用。
例如:修改xml文件的内容:
<?xml version="1.0"?>
<people>
<person>
<name>zhangsan</name>
<age>30</age>
<sex>female</sex>
</person>
</people>
现在要求把姓名、年龄、性别解析出来。必须先将指定的元素从person name text。
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
public class DOMDemo02 {
public static void main(String[] args) throws Exception {
// 1、建立DocumentBuilderFactory
DocumentBuilderFactory factory = null;
factory = DocumentBuilderFactory.newInstance();
// 2、建立DocumentBuilder
DocumentBuilder builder = factory.newDocumentBuilder();
// 3、建力Document,将整个XML文档形成DOM树
Document doc = builder.parse("e:\\demo.xml");
NodeList nl = doc.getElementsByTagName("person");
Element per = (Element) nl.item(0); // 定位节点到person之中
System.out.println(per.getElementsByTagName("name").item(0)
.getFirstChild().getNodeValue());
System.out.println(per.getElementsByTagName("age").item(0)
.getFirstChild().getNodeValue());
System.out.println(per.getElementsByTagName("sex").item(0)
.getFirstChild().getNodeValue());
}
}
如果在一个<people>元素中包含了多个<person>节点呢?
<?xml version="1.0"?>
<people>
<person>
<name>zhangsan</name>
<age>30</age>
<sex>female</sex>
</person>
<person>
<name>lisi</name>
<age>31</age>
<sex>male</sex>
</person>
</people>
解析时只能采用循环的方式完成。
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
public class DOMDemo03 {
public static void main(String[] args) throws Exception {
// 1、建立DocumentBuilderFactory
DocumentBuilderFactory factory = null;
factory = DocumentBuilderFactory.newInstance();
// 2、建立DocumentBuilder
DocumentBuilder builder = factory.newDocumentBuilder();
// 3、建力Document,将整个XML文档形成DOM树
Document doc = builder.parse("e:\\demo.xml");
NodeList nl = doc.getElementsByTagName("person");
for(int x=0;x<nl.getLength();x++){
Element per = (Element) nl.item(x); // 定位节点到person之中
System.out.println(per.getElementsByTagName("name").item(0)
.getFirstChild().getNodeValue());
System.out.println(per.getElementsByTagName("age").item(0)
.getFirstChild().getNodeValue());
System.out.println(per.getElementsByTagName("sex").item(0)
.getFirstChild().getNodeValue());
}
}
}
思考:如果每一个人会有多个地址,那么该如何解析呢?XML文件如下:
<?xml version="1.0"?>
<people>
<person>
<name>zhangsan</name>
<age>30</age>
<sex>female</sex>
<address>
<addr>aaaaaaa</addr>
<addr>bbbbbbb</addr>
<addr>ccccccc</addr>
</address>
</person>
<person>
<name>lisi</name>
<age>31</age>
<sex>male</sex>
<address>
<addr>ddddddd</addr>
<addr>eeeeeee</addr>
</address>
</person>
</people>
解析程序如下:
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
public class DOMDemo04 {
public static void main(String[] args) throws Exception {
// 1、建立DocumentBuilderFactory
DocumentBuilderFactory factory = null;
factory = DocumentBuilderFactory.newInstance();
// 2、建立DocumentBuilder
DocumentBuilder builder = factory.newDocumentBuilder();
// 3、建力Document,将整个XML文档形成DOM树
Document doc = builder.parse("e:\\demo.xml");
NodeList nl = doc.getElementsByTagName("person");
for(int x=0;x<nl.getLength();x++){
Element per = (Element) nl.item(x); // 定位节点到person之中
System.out.println(per.getElementsByTagName("name").item(0)
.getFirstChild().getNodeValue());
System.out.println(per.getElementsByTagName("age").item(0)
.getFirstChild().getNodeValue());
System.out.println(per.getElementsByTagName("sex").item(0)
.getFirstChild().getNodeValue());
NodeList al = per.getElementsByTagName("address") ;
Element addr = (Element)al.item(0) ;
NodeList ads = addr.getElementsByTagName("addr") ;
for(int y=0;y<ads.getLength();y++){
System.out.println("\t\t|- " + ads.item(y).getFirstChild().getNodeValue()) ;
}
}
}
}
以上全部都是DOM的基本解析操作,但是在DOM中它还可以生成一份XML文档。
分享到:
相关推荐
pugixml是一款轻量级、高性能的C++库,专为XML解析和操作而设计。这个库由Artemev开发,提供了简单易用的API,使得在C++项目中处理XML文档变得非常便捷。本示例将详细介绍如何使用pugixml进行XML的读取和写入操作。 ...
在PowerBuilder(简称PB)这个强大的开发环境中,处理XML文件是一项常见的任务。XML(Extensible Markup Language)是一种用于存储和传输数据的通用格式,尤其在跨平台和网络应用中广泛使用。本示例主要探讨如何在...
TinyXML和TinyXML2是两个小型的开源库,专门用于解析和操作XML(eXtensible Markup Language)文档。这两个库都是用C++编写的,为C++开发者提供了方便的接口来读取、写入和操作XML数据。下面将详细介绍这两个库的...
易语言XML解析是编程领域中的一个重要主题,尤其对于使用易语言进行开发的程序员来说,理解并掌握XML(可扩展标记语言)的解析方法是至关重要的。XML作为一种结构化数据存储和交换格式,广泛应用于网络通信、配置...
andxml汉化版是一个xml文件反编译工具,可与APKTOOL反编译配合使用,APK文件使用APKTool反编译生成XML文件后,就可以直接通过它进行汉化编辑 注意: 1、一键机器翻译会造成某些代码出现翻译错误现象,请人工识别。...
TinyXML-2 是一个简单、小型、高效的 C++ XML 解析器,可以被轻松集成到其他程序中。它使用文档对象模型(DOM)的方式解析XML,可解析 XML 文档,并根据该文档构建可读取、修改和保存的文档对象模型。 作为XML解析...
**Pugixml详解:一个高效易用的XML解析库** 在编程中,XML(Extensible Markup Language)是一种被广泛使用的数据交换格式,特别是在跨平台通信、配置文件和数据存储等领域。为了处理XML文档,开发者通常需要依赖...
使用java工具xml2axml.jar反编译AndroidManafest文件 通过xml2axml.jar工具反编译AndroidManafest文件 还原AndroidManafest.xml详细过程: 1、获取到apk 2、解压获取里面的AndroidManifest.xml文件 3、在xml2axml....
Oracle数据库系统提供了强大的XML处理能力,这主要体现在其内置的几个PL/SQL包上,如DBMS_XMLDOM、DBMS_XMLPARSER和DBMS_XMLQUERY。这些包为开发者提供了处理XML文档的一整套工具,使得在数据库环境中进行XML数据的...
XML(eXtensible Markup Language)是一种用于标记数据的语言,其设计目的是传输和存储数据,而非显示数据。在IT行业中,XML因其结构清晰、可扩展性强的特点,被广泛应用于数据交换、配置文件、Web服务等领域。本文...
TinyXML-2,通常以tinyxml2库的形式存在,是一个轻量级的C++库,专门用于解析和操作XML文档。这个库由李·斯坦普(Lee Stemp)开发,设计简洁,易于集成到各种项目中,特别是对于嵌入式系统和资源有限的环境。在给定...
在Qt框架中,XML文件是一种常见的数据存储格式,它提供了结构化的数据表示方式,便于程序读取和写入。QTreeWidget是Qt提供的一种用于显示树状结构数据的控件,它可以很好地展示XML文件的层次结构。QXml是Qt中的XML...
TinyXML2是一个小型、快速且易于使用的C++库,用于解析和生成XML文档。这个库的设计目标是简单、高效,并且适用于嵌入式系统。在本文中,我们将深入探讨如何使用TinyXML2来解析和创建XML文件,特别是涉及到CDATA区段...
XML(eXtensible Markup Language)是一种用于标记数据的语言,广泛应用在软件开发、Web服务、配置文件等领域。本文将深入探讨XML与JavaBean之间的转换、XML标签的大小写规则、XML特殊符号的处理以及CDATA的生成。 ...
- 库的主要类包括`XMLDocument`(XML文档对象)、`XMLElement`(XML元素)、`XMLText`(XML文本)、`XMLComment`(XML注释)和`XMLAttribute`(XML属性)等。 2. **解析XML文件** - 使用`XMLDocument::LoadFile()...
XML(eXtensible Markup Language)是一种用于标记数据的语言,广泛应用于配置文件、数据交换、文档存储等领域。TinyXML2是轻量级的C++ XML解析库,它提供了简单、直接的方式来读写XML文档。本项目是基于tinyxml2...
XML(eXtensible Markup Language)是一种用于标记数据的语言,广泛应用于数据交换、配置文件、文档存储等领域。XML Schema(通常缩写为XSD)则是为XML文档定义结构和数据类型的规范,它允许我们对XML文档进行更严格...
XMLParser是一种用于解析XML文档的C++实现,它旨在提供简单、小巧且稳定的解决方案,以处理XML数据。XML,即可扩展标记语言,是用于存储和传输数据的标准格式,广泛应用于配置文件、数据交换和文档结构化等领域。XML...
XML(eXtensible Markup Language)是一种用于存储和交换数据的标记语言,广泛应用于软件开发、数据存储和网络通信等领域。Matlab作为一个强大的数值计算和数据分析环境,也提供了与XML交互的功能,这主要通过XML ...
(2) 解压Xml Tools 2.4.8 Unicode.zip,关闭Notepad++ (3) 将xmltools子文件夹下的XMLTools.dll拷贝至Notepad++的plugins子文件夹 (4) 将ext_libs子文件夹下的所有dll文件拷贝至Notepad++的根目录(与notepad++.exe...