导图
XML文档
文档结构
声明
<?xml version=1.0 encoding="UTF-8"?>
标签
Demo
https://www.w3school.com.cn/example/xmle/simple.xml
命名空间
XML解析器在解析XML文档时,对于重名的元素可能出现解析冲突。命名空间有助于标准化元素和属性,并为他们加上唯一的标识。语法如下:
xmlns:[prefix]="[命名空间的URI]"
prefix:前缀名称,用作命名空间的别名
xmlns:保留属性
Demo
https://www.w3school.com.cn/xml/xml_namespaces.asp
XML验证
用来确保xml文档的格式是良好的。
DTD
DTD(Document Type Definition)。
声明DTD
<!DOCTYPE 根元素 [定义内容]>
DTD元素
语法:
- 限定元素
<!ELEMENT NAME CONTENT>
ELEMENT:关键字
NAME:元素名
CONTENT:元素类型(常用的元素类型如下)
1 #PCDATA :可以包含任何字符数据,但不可以包含任何子元素
<!ELEMENT title(#PCDATA)>
2 纯元素类型:只包含子元素,并且除这些子元素外没有任何文本内容
<!ELEMENT poems(poem*)>
- 属性列表:<!ATTLIST 元素名 属性名 属性取值 限制条件>
<!ATTLIST student sex (male|female) #REQUIRED>
<!ATTLIST student age (0|2|3|9) #IMPLIED>
Demo
https://www.runoob.com/dtd/dtd-examples.html
Schema
Schema自身也是一种xml文档。
文档结构
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" //声明命名空间
targetNamespace="http://mynamespace/myschema" //本schema自定义的属性和数据类型来自此命名空间
elementFormDefault="unqualified" //命名空间不一定遵循schema(若是qualified则必须遵循)>
Schema常用元素
还有simpleType
及其子元素restriction
和list
和
complexType
及其子元素sequence
和choice
。
包含子元素的,就需要用到复杂类型。
如果元素的Type虽然是基本类型,但需要加入某些限制(比如:性别是字符串,但只能是男女,年龄应该在某一个整数范围),就可以使用自定义的简单类型。
Demo
https://www.runoob.com/schema/schema-example.html
XML解析
DOM解析
主要对象:
Document对象
(1) getElementsByTagName(String name):返回一个NodeList对象 ,包含所有指定标签名称的标签(仅有返传入的name的标签,不包括其子标签)。
(2) getDocumentElement():返回根对象(一个Element对象 )。
NodeList对象
(1) getLength():返回列表的长度。
(2) item(int index):返回根对象(一个Element对象 )。
Node对象
是一个抽象类。主要子类有Element,Text等。
(1) getChildNodes():返回NodeList,包含此节点所有子节点。
(2) getFirstChild()
(3) getLastChild()
(4) getNodeName()
(5) getNodeValue()
(6) getNodeType()
(7) getNextSibling():返回DOM树种此节点的下一个兄弟节点。
(8) getPreviousSibling():返回DOM树种此节点的上一个兄弟节点。
Element对象
(1) getAttritube(String attritube)
(1) getElementsByTagName(String name):返回name标签的所有后代Elements的NodeList。
DOM4J解析
获取Document对象相关代码:
SAXReader reader = new SAXReader();
Document document = reader.read(new File("demo.xml"));
节点相关操作
(1) 获取文档的根元素
Element root = document.gerRootElement();
(2) 获取某节点的单个子节点 (默认第一个)
Element childNode = node.element("子节点的name");
(3) 获取某节点的文档内容/设置某节点文本内容
String text = node.getText();
node.setText("值");
(4) 获取某节点的所有子节点
Element childNodes = node.elements("子节点的name");
(5) 遍历节点集合(先获得某节点的子节点集合)
for(Iterator it = nodes.iterator(); it.hasnext(); ) {
Element elem = (Element)it.next();
//...
}
(6) 在某节点下增加子节点
Element elem = superNode.addElement("子节点名字");
(7) 删除某节点(通过其父节点删除)
superNode.remove(childNode)
属性相关操作
(1) 获取某节点下的某属性
Attribute attribute = node.attribute("属性名");
(2) 获取属性的文本值
String text = attribute.getText();
//或者
String text = node.arrtibuteValue("属性名");
(3) 遍历某节点所有属性
for(Iterator it = node.attributeIterator(); it.hasnext(); ) {
Attribute attribute = (Attribute)it.next();
//...
}
(4) 设置某节点属性和属性值
node.addAttribute("name","Tom");
(5) 设置某属性的属性值
attribute.addAttribute("属性值");
(6) 删除某节点的某属性
node.remove();