1.XML的简介
XML |
HTML |
EXtensible Markup Language 可扩展标记语言,可自定义标签 (1)名称中可以包含字母、数字、下划线、减号,但不能以数字、减号开头 (2)不能以xml开头,无论是大写还是小写都不可以 (3)不能包含空格 |
Hypertext markuplanguage 超文本标记语言,固定标签 |
严格区分大小写 |
不区分大小写 |
所有的标签必须成对出现,且标签不能交叉嵌套 |
大多的标签是成对出现,但也有不成对出现的标签,如<br> |
文档声明必须为<?xml开头,以?>结束 |
html无此要求 |
标签结构:开始标签、元素体、结束标签 |
标签结构:开始标签、元素体、结束标签 |
属性是元素的一部分,它必须出现在元素的开始标签中,一个元素可以有0~N个属性,但一个元素中不能出现同名属性 |
属性不必出现在元素的开始标签中,可以放在css文件中,或者内联css |
注释以“<!--”开始,以“-->”结束 |
注释以“<!--”开始,以“-->”结束 |
用来存储数据或配置文件 |
用来解析显示页面 |
2.XML中常用的转义字符
大于号(>)
小于号(<)
双引号(")
单引号(')
&号(&s;)
备注:当大量的转义字符出现在xml文档中时,会使xml文档的可读性大幅度降低。这时如果使用CDATA段就会好一些。
在CDATA段中出现的“<”、“>”、“””、“’”、“&”,都无需使用转义字
符。CDATA的格式:<![CDATA[ 要显示的内容 ]]>
3.XML约束
DTD约束 |
Schema约束 |
DTD(Document Type Definition),文档类型定义,用来约束XML文档。 |
Schema是新的XML文档约束;要比DTD强大很多; Schema本身也是XML文档,但Schema文档的扩展名为xsd,而不是xml。 |
内部DTD:在XML文档内部嵌入DTD,只 对当前XML文档有效; 外部DTD:独立的DTD文件,扩展名为.dtd; <!DOCTYPE students SYSTEM“stud.dtd”> |
<?xml version="1.0" encoding="UTF-8"?> <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org/demo" elementFormDefault="qualified"> <element name="bookstore"> <complexType> <!—包含元素或属性的标签--> <sequence maxOccurs="3" minOccurs="1"><!—至少出现1次,最多3次--> <element name="book"> <complexType> <sequence> <element name="title"> <complexType> <simpleContent> <extension base="string"> <attribute name="lang" type="string"></attribute> </extension> </simpleContent> </complexType> </element> <element name="author" type="string"></element> <element name="year" type="date"></element> <element name="price" type="double"></element> </sequence> <attribute name="category" type="string" use="required"></attribute> </complexType> </element> </sequence> </complexType> </element> </schema> |
内部示例: <!ELEMENT students (student+)> <!ELEMENT student (name,age,sex)> <!ELEMENT name (#PCDATA)> <!ELEMENT age (#PCDATA)> <!ELEMENT sex (#PCDATA)> |
|
使用*、+、?来指定子元素出现的次数 *:可以出现0~N次; +:可以出现1~N次; ?:可以出现0~1次。 |
4.XML的解析
在xml的解析中主要讲解了dom4j
4.1 dom4j的快速入门:
//第一步:创建解析对象
SAXReader sr=new SAXReader();
//第二步:读取相应的XML文件,read中的内容为需要读取的xml文件的路径
Document doc=sr.read(“*******”);
//第三步:得到相应的根元素
Element root=doc.getRootElement();
//再调用其他方法,获取子元素
4.2 Xpath的快速入门
//第一步:创建解析对象
SAXReader reader = new SAXReader();
//第二步:读取xml文件
Document doc=reader.read(“*****”);
//第三步:得到要求的结点(Nodes或singleNode)
demo1:
List<Element> elements = document.selectNodes("//year");
//该方法是获得所有year标签
for(Element ele:elements){
System.out.println(ele.getText());
}
demo2:
Element ele = (Element) document.selectSingleNode("//book[@category='WEB']/price");
//该方法是获取属性名为category,属性值为web的book标签下的price标签,结果是单个标签
System.out.println(ele.getText());
dom4j中常用的方法:
Node方法:
l String asXML():把当前节点转换成字符串,如果当前Node是Document,那么就会把整个XML文档返回;
l String getName():获取当前节点名字;Document的名字就是绑定的XML文档的路径;Element的名字就是元素名称;Attribute的名字就是属性名;
l Document getDocument():返回当前节点所在的Document对象;
l short getNodeType():获取当前节点的类型;
l String getNodeTypeName():获取当前节点的类型名称,例如当前节点是Document的话,那么该方法返回Document;
l String getStringValue():获取当前节点的子孙节点中所有文本内容连接成的字符串;
l String getText():获取当前节点的文本内容。如果当前节点是Text等文本节点,那么本方法返回文本内容;例如当前节点是Element,那么当前节点的内容不是子元素,而是纯文本内容,那么返回文本内容,否则返回空字符串;
l void setDocument(Document doc):给当前节点设置文档元素;
l void setParent(Element parent):给当前节点设置父元素;
l void setText(String text):给当前节点设置文本内容;
Branch方法:
l void add(Element e):添加子元素;
l void add(Node node):添加子节点;
l void add(Comment comment):添加注释;
l Element addElement(String eleName):通过名字添加子元素,返回值为子元素对象;
l void clearContent():清空所有子内容;
l List content():获取所有子内容,与获取所有子元素的区别是,<name>liSi</name>元素没有子元素,但有子内容;
l Element elementById(String id):如果元素有名为“ID”的属性,那么可以使用这个方法来查找;
l int indexOf(Node node):查找子节点在子节点列表中的下标位置;
l Node node(int index):通过下标获取子节点;
l int nodeCount():获取子节点的个数;
l Iterator nodeIterator():获取子节点列表的迭代器对象;
l boolean remove(Node node):移除指定子节点;
l boolean remove(Commont commont):移除指定注释;
l boolean remove(Element e):移除指定子元素;
l void setContent(List content) :设置子节点内容;
Document方法:
l Element getRootElement():获取根元素;
l void setRootElement():设置根元素;
l String getXmlEncoding():获取XML文档的编码;
l void setXmlEncoding():设置XML文档的编码;
Element方法:
l void add(Attribute attr):添加属性节点;
l void add(CDATA cdata):添加CDATA段节点;
l void add(Text Text):添加Text节点;
l Element addAttribute(String name, String value):添加属性,返回值为当前元素本身;
l Element addCDATA(String cdata):添加CDATA段节点;
l Element addComment(String comment):添加属性节点;
l Element addText(String text):添加Text节点;
l void appendAttributes(Element e):把参数元素e的所有属性添加到当前元素中;
l Attribute attribute(int index):获取指定下标位置上的属性对象;
l Attribute attribute(String name):通过指定属性名称获取属性对象;
l int attributeCount():获取属性个数;
l Iterator attributeIterator():获取当前元素属性集合的迭代器;
l List attributes():获取当前元素的属性集合;
l String attributeValue(String name):获取当前元素指定名称的属性值;
l Element createCopy():clone当前元素对象,但不会copy父元素。也就是说新元素没有父元素,但有子元素;
l Element element(String name):获取当前元素第一个名称为name的子元素;
l Iterator elementIterator():获取当前元素的子元素集合的迭代器;
l Iterator elementIterator(String name):获取当前元素中指定名称的子元素集合的迭代器;
l List elements():获取当前元素子元素集合;
l List elements(String name):获取当前元素指定名称的子元素集合;
l String elementText(String name):获取当前元素指定名称的第一个元素文件内容;
l String elementTextTrime(String name):同上,只是去除了无用空白;
l boolean isTextOnly():当前元素是否为纯文本内容元素;
l boolean remove(Attribute attr):移除属性;
l boolean remove(CDATA cdata):移除CDATA;
l boolean remove(Text text):移除Text。
DocumentHelper静态方法介绍:
l static Document createDocument():创建Dcoument对象;
l static Element createElement(String name):创建指定名称的元素对象;
l static Attribute createAttrbute(Element owner, String name, String value):创建属性对象;
l static Text createText(String text):创建属性对象;
static Document parseText(String text):通过给定的字符串生成Document对象;