xml申明
XML实体引用
实体引用 | 对应符号 | 说明 |
---|---|---|
< ; | < | 小于(空格都要去掉) |
> ; | > | 大于 |
& ; | & | 和号 |
&apos ; | ’ | 单引号 |
" ; | " | 双引号 |
CDATA标签
CDATA 指的是不应由XML解析器进行解析的文本数据
从"<![CDATA[ " 开始,到"]]>" 结束
XML语义约束
xml语义约束有两种定义方式:"DTD 与"XML Schema
Document Type Definition(DTD)
是一种简单的语义约束方式,扩展名为 .dtd 。
利用DTD中的"<!ELEMENT>标签,定义XML文档中允许出现的节点及数量,例子如下:
定义hr节点下只允许出现1个employee子节点。
<!ELEMENT hr (employee)>
employee节点下必须包含以下四个节点,且按顺序出现。
<!ELEMENT employee (name,age,salary,de[partment)>
定义name标签体只能是文本,#PCDATA代表文本元素
<!ELEMENT name(#PCDATA)>
DTD定义节点数量:
hr节点下最少出现一个employee子节点
<!ELEMENT hr (employee+)>
hr节点下可能出现0....n个employee子节点。
<!ELEMENT hr (employee*)>
hr节点下最多出现1个mployee子节点
<!ELEMENT hr (employee?)>
在XML中使用<!DOCTYPE>标签来引用DTD文件:
书写格式:
<!DOCTYPE 根节点 SYSTEM “dtd文件路径”>
属性设定
<!ATTLIST 节点 属性名 CDATA "">:
<!ATTLIST employee no CDATA "">
XML Schema
< element name=“跟节点” minOccurs=“1” maxOccurs=“999”> | 声明跟节点 ,min最少出现1次,max最多出现999个 |
---|---|
< complexTYpe> | 复杂节点,包含子节点时必须使用这个标签 |
< sequence> | 序列,里面子节点必须按顺序书写 |
< attribute name=“属性名” type=“类型” use=“required”(use后的是 必须存在)> | 定义属性 |
< simpleType> | 简单类型约束 |
< restriction base=“类型”> | 限制 |
< minInclusive value=“数字”> | 最小值 |
< maxInclusive value=“数字”> | 最大值 |
例子:
<element name="hr">
<complexType>
<sequence>
<element name="employee" minOccurs="1" maxOccurs="999">
<complexType>
<sequence>
<element name="name" type="string">
</element>
<element name="age" >
<simpleType>
<restriction base="integer">
<minInclusive value="18"></minInclusive>
<maxInclusive value="60"></maxInclusive>
</restriction>
</simpleType>
</element>
<element name="salary" type="integer"></element>
<element name="department">
<complexType>
<sequence>
<element name="daname" type="string"></element>
<element name="address" type="string"></element>
</sequence>
</complexType>
</element>
</sequence>
<attribute name="no" type="string" use="required"></attribute>
</complexType>
</element>
</sequence>
</complexType>
</element>
在XML中引用DTD文件:
书写格式:
< 跟命名 xmlns:xsl=“http://www.w3.org/2001/XMLSchema-instance” xsi:noNamespaceSchemaLocation=“文件地址”>
< hr xmlns:xsl="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="hr.xsd">
dom4j解析 xml
SAXReader | 将XML解析后以树的形式保存在内容中 |
---|---|
.element(“标签名”) | 用于获取唯一的子节点对象 |
.getText() | 用于获取便签文本 |
.elementText(“标签”) | 获取子节点的文本 |
attribute(“属性名”) | 获取属性的值 |
.getRootElement() | 获取根节点 |
例子:
/**
* Created by 宋 on 2021/4/1.
*/
public class HrReader {
public void readXml(){
String file ="f:/ij_diama/school/src/hr.xml";
SAXReader reader =new SAXReader();
try {
Document document=reader.read(file);
//获取XML文档的根节点,及hr标签
Element root=document.getRootElement();
List<Element> employees =root.elements("employee");
for (Element employee:employees){
//element方法用于获取唯一的子节点对象
Element name = employee.element("name");
String empName= name.getText();//getText()方法用于获取便签文本
System.out.println(empName);
System.out.println(employee.elementText("age"));//简写
Element department = employee.element("department");
System.out.println(department.element("dname").getText());
//获取属性内的值
Attribute att =employee.attribute("no");
System.out.println(att.getText());
}
} catch (DocumentException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
HrReader reader =new HrReader();
reader.readXml();
//System.exit(0);
}
}
例用dom4j 更新 XML
.addElement() | 添加一个节点 |
---|---|
.addAttribute(“属性名”,“值”) | t添加一个属性 |
.addElement(“标签名”) | 添加一个标签 |
.setText(“文本”) | 添加内容 |
document.write() | 把内存的更新写入文件 |
例子:
public class HrWriter {
public void writeXml(){
String file = "f:/ij_diama/school/src/hr.xml";
SAXReader reader = new SAXReader();
try {
Document document = reader.read(file);
Element root = document.getRootElement();
Element employee = root.addElement("employee");
employee.addAttribute("no", "3311");
Element name = employee.addElement("name");
name.setText("李铁柱");
employee.addElement("age").setText("37");
employee.addElement("salary").setText("3600");
Element department = employee.addElement("department");
department.addElement("dname").setText("人事部");
department.addElement("address").setText("XX大厦-B105");
//文件输出流
Writer writer = new OutputStreamWriter(new FileOutputStream(file) , "UTF-8");
document.write(writer);
writer.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) {
HrWriter hrWriter = new HrWriter();
hrWriter.writeXml();
}
}
XPath路径表达式
最常用的基本表达式
表达式 | 描述 |
---|---|
nodename | 选取此节点的所有子节点 |
/ | 从根节点选取 |
// | 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置 |
. | 选取当前节点的父节点 |
. . | 选取当前节点的父节点 |
@ | 选取属性 |
案例
路径表达式 | 结果 |
---|---|
bookstore | 选取bookstroe元素的说有子节点 |
/bookstore | 选取根元素bookstore(假如路径起始于斜杠【/】,则此路径始终代表到某元素的绝对路径) |
bookstore/book | 选取bookstore的子元素所有的book元素 |
//book | 选取所有book子元素,不管它位置 |
bookstore//book | 选择属于bookstore元素后代的所有book元素,而不管它们位于bookstore下的什么位置 |
//@lang | 选取lang的所有属性 |
谓语表达式:
路径表达式 | 结果 |
---|---|
/bookstore/book[1] | 选取属于bookstore子元素的第一个book元素 |
/bookstore/book[last()] | 选取属于bookstore子元素的最后一个book元素 |
/bookstore/book[last()-1] | 选取属于bookstore子元素的倒数第二个book元素 |
/bookstore/book[position() < 3] | 选取最前面的两个属于bookstore元素的子元素book元素 |
//title[@lang] | 选取所有名为lang的属性的title元素 |
//title[@lang=‘eng’] | 选取所有title元素,且这些元素拥有值为eng 的 lang 属性 |
/bookstore/book[price>35.00] | 选取bookstore元素的所有book元素,且其中的price 元素的值必须大于35.00 |
/bookstore/book[price>35.00]/title | 选取bookstore元素的中book元素的所有title元素,且其中的price 元素的值必须大于35.00 |
获取信息
函数 | 作用 |
---|---|
.selectNodes(参数) | 执行XPath ,返回一个list集合,指向节点为Node |
.attributeValue(“属性名”) | 直接获取属性名中的值 |
例子:
/**
* Created by 宋 on 2021/4/1.
*/
public class XPathTestor {
public void xpath(String xpathExp){
String file ="f:/ij_diama/school/src/hr.xml";
SAXReader reader =new SAXReader();
try {
Document document=reader.read(file);
List<Node> nodes =document.selectNodes(xpathExp);
for (Node node :nodes){
Element emp =(Element)node;//node为父类要强制转换
System.out.println(emp.attributeValue("no"));
System.out.println(emp.elementText("name"));
System.out.println(emp.elementText("age"));
System.out.println(emp.elementText("salary"));
System.out.println("====================");
}
} catch (DocumentException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
XPathTestor xPathTestor=new XPathTestor();
//xPathTestor.xpath("/hr/employee");
//xPathTestor.xpath("//employee");
//xPathTestor.xpath("//employee[salary<4000]");
// xPathTestor.xpath("//employee[name='李天柱']");
//xPathTestor.xpath("//employee[@no=3304]");
//同时获取第3 和第8 的员工
xPathTestor.xpath("//employee[3] | //employee[8]");
}
}