通俗理解:就比如说一个管理系统比作一个做模具的机器,那么这个机器在运动之前需要设置好一些参数,作出模具的大小,形状等,即管理系统就像是机器,而XML就像是这些参数的一个清单,在没有XML的情况下,这些参数是在管理系统内的,每次修改完一些参数,就要重新把机器构建一遍,而抽取之后,系统不用再重建,只要把参数改好,重启机器即可,这就是配置文件的使用目的。
预定义:就是指像<h1></h1>、<ul><li></li></ul>、<p>等等这样的标签,他们都是已经
定义了的,像h1就是一级标题,ul、 li 就是列表,p标签就是段落,但是div它就只是一个div,
它除了是块级元素,不会对里面的内容做什么,需要你自己去定义样式,这样它才能根据样式去显示
pcdata是用来说明元素信息的,表示该元素不能再有 子元素/子节点
用法:
1.首先编辑DTD文件
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT hr (employee+)> 规定XML中至少出现一次employee
<!ELEMENT employee (name,age,salary,department)>中间那个空格是极其易错点,否则约束无效
<!ATTLIST employee no CDATA ""> 表示有no属性,属性名为no,类型是文本类型,默认值""
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT salary (#PCDATA)>
<!ELEMENT department (dname,address)>
<!ELEMENT dname (#PCDATA)>
<!ELEMENT address (#PCDATA)>
2.在XML文件中引用DTD文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hr SYSTEM "hr.dtd"> 加载约束,hr代表根节点标签,SYSTEM代表本地文件
<!-- 人力资源管理系统 -->
<hr>
<employee no="3301">
<name>李铁柱</name>
<age>37</age>
<salary>3600</salary>
<department>
<dname>人事部</dname>
<address>XX大厦-B105</address>
</department>
</employee>
<employee no="3302">
<name>林海</name>
<age>50</age>
<salary>7000</salary>
<department>
<dname>财务部</dname>
<address>XX大厦-B106</address>
</department>
</employee>
<employee no="3303">
<name>安娜</name>
<age>24</age>
<salary>4600</salary>
<department>
<dname>人事部</dname>
<address>XX大厦-B105</address>
</department>
</employee>
</hr>
用法:
1.首先编写XSD的规范文件
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema">
<element name="hr">
<!-- complexType标签含义是复杂节点,包含子节点时必须使用这个标签 -->
<complexType>
<sequence>
<element name="employee" minOccurs="1" maxOccurs="9999">
<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="dname" 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>
</schema>
2.在XML中引用相应的文件
<?xml version="1.0" encoding="UTF-8"?>
<!-- 人力资源管理系统 -->
<!--链接的作用是向文档说明,我们用了Schmal文件,然后下一个属性给出引用位置-->
<hr xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="hr.xsd">
<employee no="3309">
<name>张三</name>
<age>31</age>
<salary>4000</salary>
<department>
<dname>会计部</dname>
<address>XX大厦-B103</address>
</department>
</employee>
<employee no="3310">
<name>李四</name>
<age>23</age>
<salary>3000</salary>
<department>
<dname>工程部</dname>
<address>XX大厦-B104</address>
</department>
</employee>
</hr>
public class HrReader {
public void readXML() {
String file="C:\\Users\\Administrator\\eclipse-workspace\\xml\\src\\hr.xml";
//SAXReader类是读取XML文件的核心类,用于将XML解析后以“树”的形式保存在内存中。
SAXReader reader =new SAXReader();
try {
Document document=reader.read(file);
//获取XML文档的根节点,即hr标签
Element root=document.getRootElement();
//elements方法用于获取指定的标签集合,把所有employee放入到employees中
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);
}
} catch (DocumentException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
HrReader reader =new HrReader();
reader.readXML();
}
}
public void writeXML() {
//导入xml文件
String file="C:\\Users\\Administrator\\eclipse-workspace\\xml\\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("36");
employee.addElement("salary").setText("3600");
Element department=employee.addElement("department");
department.addElement("dname").setText("人事部");
department.addElement("address").setText("XXX");
//写入XML文件,因为设置好后,起始数据都是在内存中的,还要往外存中写
Writer writer=new OutputStreamWriter(new FileOutputStream(file),"UTF-8");
document.write(writer);
writer.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
HrWriter hrWriter=new HrWriter();
hrWriter.writeXML();
}
public class XPathTestor {
//这里是固定格式,要保证能找到所有的节点值
public void xpath(String xpathExp){
String file = "E:/lianxi/xml/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;
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) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) {
//通过表达式在所有值中去筛选出符合表达式的
XPathTestor testor = new XPathTestor();
// testor.xpath("/hr/employee");
// testor.xpath("//employee");
// testor.xpath("//employee[salary<4000]");
// testor.xpath("//employee[name='李铁柱']");
// testor.xpath("//employee[@no=3304]");
// testor.xpath("//employee[1]");
// testor.xpath("//employee[last()]");
//testor.xpath("//employee[position()<3]");
testor.xpath("//employee[3] | //employee[8]");
}
}