xml (可扩展标记语言) 全称: Extended Markup Language
可扩展的含义:允许程序员按照自己的想法去扩展新的标签
但是扩展的时候,必须要遵循XML规范
xml的特点:
自带描述性,
可以支持跨平台,
保留了面向对象编程的层次感
编写xml的语法
Xml的文档声明:
version="1.0" 表示版本信息,当前版本信息默认1.0,不需要修改
encoding="UTE-8" 表示使用编码集,这里采用utf-8编码集
standalone="yes" 表示后面的内容是否都是属于本文档的,yes表示后面内容全部来自于本文档,no表示不全来自本文档
注意:文档声明顺序不能改变,不然会报错,另外xml严格区分大小写
xml的注释
语法:
如错误写法:
2、注释需要严格遵循注释的语法,不能写成<-- -->、、 )
注释的作用:告诉xml解析器,不要解析被注释的内容
空白的作用:
在xml中,可以使用空格,制表符,回车等方式,让文档看起来更直观
xml的文档元素
语法:<开始标签>内容...结束标签>
元素可以是整个文档中,最基本的数据存储单位,或者说最基本的逻辑单位
定义标签时 需要遵循一下规范:
元素内容:
小刘
18
3、实体(所谓实体,就是指 < > & “ ‘ 的替代)
字符名称 |
字符 |
实体引用 |
和 |
& |
& |
大于号 |
> |
> |
小于号 |
< |
< |
单引号 |
‘ |
' |
双引号 |
“ |
" |
4、静态语句块
语法:
静态语句块作用:告诉xml解析器,我内部的内容,没有什么持殊的含义,就是一个普通的字符串
如: & “ ‘ ]]>
元素还可以添加属性:
属性的作用:进一步描述或者修饰该元素
定义属姓名称的时候,也需要遵循一定的规则:
1、属性名称可以包含字母、下划线、中文(但是不推荐中文) 名称中不能有空格,也一定不在名称中使用空格、冒号、感叹号等等的其他符号-
2、在同一个元素中,属性名不能重复
3、属性名区分大小写
4、定义标属性名时,一定不在名称中包含xml (XML)或者xml. 或者 .xml 等内容
5、属性定义的方式,采用k=v键值对的方式进行定义,例如:type=”string”值必须包含在“”内,而且”必须成对出现
(DTD (Document Type Definition) Schema)规范XML
XML的解析技术:DOM/SAX ----完成OXM object-XML-Mapping
1、DOM文档对象模型,采用树形结构来完成对文档的解析,它在解析时,会将整个文档加载到内存中,然后形成"节点数",当文档内容过多,或者需要解析的文档过多,会造成服务器内存紧张。
2、SAX基于事件驱动模式下的文档解析技术,在识别不同的XML语法结构时,SAX解析器使用回调机制来通知客户端应用程序,而不是将整个文档都存储在内存中。即使是处理大型文档也不会占用大量内存。
具有SAX的XML处理器并不创建数据结构,而是扫描输入XML文档,并生成元素开始、元素结束等事件,在发生事件时,解析器会通知应用程序。
由于SAX不创建显式数据结构,因此它比DOM的效率更高。
DOM4J框架,提供了一套完整的针对DOM和SAX的解析技术,目前使用较为广泛
由于在实际项目开发中,采用DOM4J的占主流,所以讲解DOM4J的使用。
在org.dom4j包中定义了DOM4J使用的主要接口,表1显示了DOM4J这些接口。
表1 DOM4J的主要接口 |
|
接口 |
说明 |
Attribute |
定义了XML的属性 |
CDATA |
定义了XML CDATA 区域 |
CharacterData |
标识基于字符的节点。如CDATA,Comment, Text. |
Comment |
定义了XML注释的行为 |
Document |
定义了XML文档 |
DocumentType |
定义XML DOCTYPE声明 |
Element |
定义XML 元素 |
ElementHandler |
定义了 Element 对象的处理器 |
Node |
为所有的dom4j中XML节点定义了多态行为 |
ProcessingInstruction |
定义 XML 处理指令 |
Text |
定义XML 文本节点 |
XPath |
在分析一个字符串后会提供一个XPath 表达式 |
1)利用DOM4J创建XML
本节将使用dom4j API创建 XML 文档。使用 DocumentHelper 类创建一个文档实例。 DocumentHelper类是生成 XML文档节点的dom4j API工厂类。
Document document = DocumentHelper.createDocument();
使用 addElement() 方法创建根元素 catalog 。addElement() 用于向 XML 文档中增加元素,并添加注释“An XML catalog”。
Element catalogElement = document.addElement("catalog");
catalogElement.addComment("An XML catalog");
在catalog元素中使用 addProcessingInstruction() 方法增加一个XML处理指令。
catalogElement.addProcessingInstruction("target","text");
在catalog元素中使用addElement()方法增加book元素。使用addAttribute()方法向 book元素添加title和publisher属性。
Element bookElement = catalogElement.addElement("book");
bookElement.addAttribute("title", "XML Zone");
bookElement.addAttribute("publisher", "Java developer");
向book元素里添加article子元素,为 article 元素增加 level 和 date 属性
Element articleElement=bookElement.addElement("article");
articleElement.addAttribute("level", "Intermediate");
articleElement.addAttribute("date", "8-2008");
向article元素中增加 title 元素,使用setText()方法设置article元素的文本。
Element titleElement=articleElement.addElement("title");
titleElement.setText("Java configuration with XML Schema");
在article元素中增加author元素在author元素中增加firstname元素和lastname元素并设置元素的文本。
Element authorElement=articleElement.addElement("author");
Element firstNameElement=authorElement.addElement("firstname");
firstNameElement.setText("tiger");
Element lastNameElement=authorElement.addElement("lastname");
lastNameElement.setText("MM");
可以使用 addDocType() 方法添加文档类型说明。
document.addDocType("catalog", null,"file://d:/xmldtds/catalog.dtd");
这样就向 XML 文档中增加了文档类型说明:
输出文档方式与JDOM很相似。
OutputFormat format = OutputFormat.createPrettyPrint()
XMLWriter output = new XMLWriter(System.out, format);
output.write( document);
output.close();
也可以输出到文件。
XMLWriter output = new XMLWriter(new FileWriter(new File("book.xml")), format);
输出格式类OutputFormat可以使用createPrettyPrint()方法设置缩减格式和createCompactFormat()设置紧凑格式。最终代码输出图2所示内容:
图2 DOM4J创建XML文档
提示:使用DOM4J应该把dom4j.jar和jaxen.jar包放置在classpath下。
2)利用DOM4J修改XML
DOM4J的xPath表达式功能可以非常方便地查找并修改XML文件中元素的内容。首先使用下面的代码创建SAXReader解析对象
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(inputFile);
“inputFile”就是需要读取的XML文件,可以是File对象、String对象或者InputStream对象。使用 XPath 表达式从 article元素中获得 level 节点列表,如果 level 属性值是“Intermediate”则改为“Introductory”。代码片段如下:
List list = document.selectNodes("//article/@level" );
Iterator iter=list.iterator();
while(iter.hasNext()){
Attribute attribute=(Attribute)iter.next();
if(attribute.getValue().equals("Intermediate")){
attribute.setValue("Introductory");
}
}
提示:表达式“//article/@level”指示找到article元素下的level属性。“//article/author”指示找到article元素下的author子元素。
还可以获取article元素列表,从article元素中的 title 子元素得到一个迭代器,并修改title元素的文本。
List list = document.selectNodes("//article" );
Iterator iter=list.iterator();
while(iter.hasNext()){
Element element=(Element)iter.next();
Iterator iterator=element.elementIterator("title");
while(iterator.hasNext()){
Element titleElement=(Element)iterator.next();
if(titleElement.getText().equals("Java configuration with XML ")){
titleElement.setText("Create flexible and extensible XML schema");
}
}
}
从上述代码可以看到DOM4J使用集合框架完成XML元素的遍历查找,使得开发变得非常方便,性能也显著提高。
以上内容总结如下: