xml 的解析
就是获取元素里面的字符数据或者属性数据
1 解析方式:
方式有很多种,但是常用的只有两种DOM 和 SAX
方式1:
DOM :(document object model)解析会把所有的文档读到内存中形成树状结构
然后整个树状结构称之为一个对象,这个对象的名字叫做document然后再进行解析element(元素),attribute(属性),
text(文本),这四个对象统称为Nod 节点
方式2:
SAX: (simple api for xml ) 基于时间驱动,读取一行,解析一行
因为读取的内容少,所以不会造成内存溢出,不可以进行增删,只能进行查询。
针对以上两种解析方式,不同公司给出了不同的方案
常用的有:
jaxp sun 比较繁琐
jdom, dom4j 的应用比较广泛
简单代码示例java 中读取
package test;
import java.io.File;
import org.dom4j.io.SAXReader;
public class mainTest {
public static void main(String[] args) {
try {
SAXReader reader = new SAXReader();
reader.read(new File("src/stus/stus.xml"));
} catch (Exception e) {
e.printStackTrace();
}
}
}
这里会莫名出现五个warning,原因是jar 包太老了,需要更新jar 包或者降低jdk 的版本。我们这里选择降低jdk 的
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by org.dom4j.io.SAXContentHandler (file:/C:/Users/Administrator/Desktop/javaweb/day01_xml&tomcat/xmlDemo/lib/dom4j-1.6.1.jar) to method com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser$LocatorProxy.getEncoding()
WARNING: Please consider reporting this to the maintainers of org.dom4j.io.SAXContentHandler
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
不出以外,还是报warning,那就升级jar包找到最新的版本在重新导入添加路径中,没有warning了。搞定。
然后我们在代码中实现根元素stus下子元素stu的子元素的读取
Element rootElement = document.getRootElement();//首先得到根元素
Element element = rootElement.element("stu");//再得到根元素的子元素
List<Element> elements = rootElement.elements();//再取得子元素的集合
for(Element a:elements) {
String name =a.element("name").getText();
String age = a.element("age").getText();
String address = a.element("address").getText();
System.out.println(name +" "+age+" "+ address);
}//遍历集合并输出
Xpath的使用
1 dom4j 里面支持Xpath 的写法。xpath 其实是xml 路径语言,支持我们再解析xml 的时候,能够快速定位到具体的元素。
Element nameelement = (Element) rootElement.selectSingleNode("//name");
System.out.println(nameelement.getText());
List<Node> selectNodes = rootElement.selectNodes("//name");
for(Node n:selectNodes) {
System.out.println(n.getText());
}
xml约束
如下的文档,属性的id 值是一样的,但是在日常生活中不常见,而且同一标签额值有好几个,问题来了,如何规定id的值唯一,或者是元素只能出现一次,不能出现多次,或者在指定的标签内出现元素名字?
DTD 约束
语法自成一派,出现的早,可读性差。
schema
语法就是xml的语法规则, 解析起来方便。schema是代替DTD而出现的,但是scheme阅读行较差,所以没有完全替代DTD。
DTD的引入方式
1 网络引入
2 本地引入
3 直接在xml 里面潜入DTD 的规则约束
<?xml version="1.0" encoding="UTF-8"?>
<!-- 引入dtd -->
<!-- <!DOCTYPE stus PUBLIC "//UNKNOWN/" "unknown.dtd"> --><!--第一种方式通过网络引入 -->
<!-- <!DOCTYPE stus SYSTEM "stus.dtd"> --><!-- 第二种方式通过本地引入dtd -->
<!-- 第三种,直接文件内引入 -->
<!DOCTYPE stus[
<!ELEMENT stus (stu)>
<!ELEMENT stu (name,age)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
]>
<stus>
<stu>
<name > 张三 </name>
<age>18</age>
</stu>
</stus>