XML 即可扩展标记语言,一种简单的数据存储语言,使用一系列简单的标记来描述结构化数据
XML 的特点
- XML 与操作系统,编程语言的开发平台无关
- 规范统一,实现不同系统之间的数据交互
以下是 XML 代码描述图书的信息
<books>
<book id="bk101">
<title>.NET高级编程title>
<author>王珊author>
<description>包含C#框架和网络编程等description>
book>
<book id="bk102">
<title>XML基础编程title>
<author>李明明author>
<description>包含XML基础概念和基本用法description>
book>
books>
表示 XML 声明,用于标明这是一个 XML 文件<>
括起来的各种标签来标记数据<>
和 结束标签 >
王珊
则表示作者信息XML 文档的主要部分是元素
元素由开始标签、结束标签和元素内容注册
元素内容指开始标签和结束标签之间的内容,可以包含子元素,字符数据等
元素的命名规则如下
xml
、XML
等开始
、
根元素
属性
标签中使用 id 属性描述图书的编号信息<元素名 属性名="属性值">
<
、"
、&
XML 中的特殊字符的处理
<
>
'
"
&
特殊字符 | 实体名称 |
---|---|
< | < |
> | > |
& | & |
" | " |
’ | ' |
CDATA - (未解析)字符数据
术语 CDATA 是不应该由 XML 解析器解析的文本数据。
像 <
和 &
字符在 XML 元素中都是非法的。
<
会产生错误,因为解析器会把该字符解释为新元素的开始。
&
会产生错误,因为解析器会把该字符解释为字符实体的开始。
CDATA 部分中的所有内容都会被解析器忽略
CDATA 语法格式如下
在实际应用当中,经常需要对 XML 文档进行各种操作
如在应用程序启动时去读取 XML 配置文件信息
或把数据库中的内容读取出来转为 XML 文档形式
这种情况就要运用到 XML 文档的解析技术
目前常用的 XML 解析技术有 4 种
<book id="bk101">
<title>三国演义title>
<author>罗贯中author>
<price>30元price>
book>
XML 文档代码如下
<PhoneInfo>
<Brand name="华为">
<Type name="P90"/>
Brand>
<Brand>
<Type name="iPhone Z"/>
<Type name="iPhone ZL"/>
Brand>
PhoneInfo>
手机收藏信息的 XML 文档对应的 DOM 树主要结构
根据使用 DOM 解析 XML 的文档步骤,关键代码如下
package Test01;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.io.IOException;
public class Test01 {
public static void main(String[] args) throws ParserConfigurationException, IOException, SAXException {
//得到 DOM 解析器的工厂实例
DocumentBuilderFactory dbf=DocumentBuilderFactory.newDefaultInstance();
//从 DOM 工厂获取 DOM 解析器
DocumentBuilder db=dbf.newDocumentBuilder();
//解析 XML 文档,等到一个 Document 对象,即DOM数
//xml 文件位置,从 src包下开始
Document doc= db.parse("src/main/java/Test01/收藏信息.xml");
//等到所有的 Brand 节点列表信息
NodeList brandList=doc.getElementsByTagName("Brand");
//循环 Brand 信息
for (int i=0; i<brandList.getLength();i++){
//获取第 i 个 Brand 元素信息
Node brand=brandList.item(i);
//获取第 i 个 Brand 元素的 name属性
Element element= (Element) brand;
String attrValue=element.getAttribute("name");
//获取第 i 个 Brand 元素的所有子元素的 name 属性值
NodeList types=element.getChildNodes();
for (int j = 0; j <types.getLength() ; j++) {
Node node=types.item(j);
if (node.getNodeType()==Node.ELEMENT_NODE){
Element typeElement= ((Element) types.item(j));
String type=typeElement.getAttribute("name");
System.out.println("手机"+attrValue+type);
}
}
}
}
}
Node 对象
方法名 | 说明 |
---|---|
getChildNodes() | 返回包含此节点所有子节点 NodeList |
getFirstChild() | 如果节点存在子节点,则返回第一个子节点 |
getLastChild() | 如果节点存在子节点,则返回最后一个子节点 |
getNextSibling() | 返回在 DOM 树中这个节点的下一个兄弟节点 |
getPreviousSibling() | 返回在 DOM 树中这个节点的上一个兄弟节点 |
getNodeName() | 返回节点的名称 |
getNodeValue() | 返回节点的值 |
getNodeType() | 返回节点的类型 |
NodeList 对象
方法名 | 说明 |
---|---|
getLength() | 返回列表长度 |
item(int idnex) | 返回指定位置的 Node 对象 |
Document 对象
方法名 | 说明 |
---|---|
getElementsByTagName(String name) | 返回一个 NodeList 对象,包含所有给定标签名的标签 |
getDocumentElement() | 返回一个代表这个 DOM 树的根节点的 Element 对象 |
Element 对象
方法名 | 说明 |
---|---|
getAttribute(String attributename) | 返回标签中给定属性名称的属性的值 |
getElementsByTagName(String name) | 返回具有给定标签名称的所有后代 Elements 的 NodeList |
注意事项
node.getNodeType()==Node.ELEMENT_NODE
即判断是否为元素节点类 | 说明 |
---|---|
Attribute | 定义了 XML 属性 |
Branch | 为能够包含子节点的节点,定义了一个公共行为 |
CDATA | 定义了 XML CDATA 区域 |
CharacterData | 是一个标识接口,标识基于字符的节点,如 CDATA、Comment 和 Text |
Comment | 定义了 XML 注释的行为 |
Document | 定义了 XML 文档 |
DocumentType | 定义 XML DOCTYPE 声明 |
Element | 定义了 XML 元素 |
ElementHandler | 定义了 Element 对象的处理器 |
ElementPath | 被 ElementHandler 使用,用于取得当前正在处理的路径层次信息 |
Entity | 定义 XML 实体 |
Node | 为 dom4j 中所有的 XML 节点定义了多态行为 |
NodeFilter | 定义了在 dom4j 节点中产生的一个滤镜或谓词的行为 |
ProcessingInstruction | 定义 XML 处理指令 |
Text | 定义了 XML 文本节点 |
Visitor | 用于实现 Visitor 模式 |
XPath | 通过分析一个字符串提供一个 XPath 表达式 |
<dependency>
<groupId>org.dom4jgroupId>
<artifactId>dom4jartifactId>
<version>2.1.4version>
dependency>
1、Document 对象相关
SAXReader reader=new SAXReader();
Document document=reader.read(new File("input.xml"));
2、节点相关
Element rootElm=document.getRootElement();
Element memberElm=rootElm.element("member"); //member 是节点名
String text=emeberElm.getText();
//或者用下面这种方式
//取得根元素下的 name 子节点的文字
String text=rootElm.elementText("name");
Element ageElm=newMemberElm.addELment("age");
ageElm.setText("29");
parentElm.remove(childElm);// childElm 是待删除的节点,parentElm是其父节点
3、属性相关
Element root=document.getRootElement();
Attribute attribute=toor.attribute("size"); //属性名 size
String text=attribute.getText();
//也可以使用
String text2=root.element("name").attributeValue("firstname");
newMemberElm.addAttribute("name","learningdom4j");
Attribute attribute=root.attribute("name");
attribute.setText("learningdom4j");
Attribute attribute=root.attribute("size"); //属性名saize
root.remove(attribute)
e attribute=toor.attribute(“size”); //属性名 size
- 取得属性的值
~~~java
String text=attribute.getText();
//也可以使用
String text2=root.element("name").attributeValue("firstname");
newMemberElm.addAttribute("name","learningdom4j");
Attribute attribute=root.attribute("name");
attribute.setText("learningdom4j");
Attribute attribute=root.attribute("size"); //属性名saize
root.remove(attribute)