XML系列包含什么
本文XML系列包含XML,DTD/Schema,Jaxp/Dom4j,dom/sax。
XML是什么?
XML是一种可扩展标记语言,一篇完整的XML会使用到文档声明,标签,属性 ,特殊字符,CDATA区以及注释。
DTD,Schema是什么?
DTD,Schema是XML的约束文档,对XML的内容进行约束。
Jaxp,Dom4j是什么?
Jaxp,Dom4j是XML的常用解析器,Java通过使用解析器能使用XML文档。
dom,sax是什么?
dom,sax是XML的两种解析技术,解析器实现了这些技术。
XML,DTD/Schema需要注意:每两个单词后面都要加一个空格
XML
关于标签,属性的书写规范:
- 区分大小写
- 数字不能开头,不能包含空格和冒号
- 不能使用xml这个单词及大写形式
XML的符号通通需要使用转义字符表示,通常为了不记忆琐碎的转义字符,可以使用CDATA区,CDATA区中所有字符可正常显式。
//CDATA区格式
<![CDATA[<标签>...<标签>]]>
完整的XML,看懂这个就会了。
//文档声明,version该xml遵循的jishu版本,encoding该xml的编码格式
<?xml version="1.0" encoding="UTF-8"?>
<person>
<p>
<name>jiwenlong</name>
<age>21</age>
</p>
<p>
<name>guoxinlei</name>
<age>21</age>
</p>
<p>
<name>popo</name>
<age>23</age>
</p>
</person>
XML约束—DTD
完整DTD文档,看这个实例。
//标签限制,<! ElEMENT...>是标准格式,类似TVSCHEDULE是标签名
// (#PCDATA)表示该标签是简单标签,简单标签里面是值
//(BANNET,DAY+)表示该标签是复杂标签,他有一个BANNET标签,多个DAY标签。
<!ELEMENT TVSCHEDULE (CHANNE+)>
<!ELEMENT CHANNE (BANNER)>
<!ELEMENT BANNER (#PCDATA)>
//标签的属性限制,<!ATTLIST>是标准格式
//类似NAME是属性名
//#IMPLIED 表示这个属性可有可无,#REQUIRED 表示这个属性必须有
<!ATTLIST TVSCHEDULE NAME CDATA #REQUIRED>
<!ATTLIST CHANNE CHAN CDATA #REQUIRED>
那么如何使用DTD约束XML,看这个实例
扫描二维码关注公众号,回复:
11574219 查看本文章
//比没有约束的xml多了一行,TVSCHEDULE是根节点标签,SYSTEM " "中是DTD约束文件的地址
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE TVSCHEDULE SYSTEM "src/Xml/DTD.dtd">
<TVSCHEDULE NAME="JI">
<CHANNE CHAN="JI">
<BANNER>JIWENLONG</BANNER>
</CHANNE>
</TVSCHEDULE>
XML约束—Schema
完整的Schema,看这个实例
/*
*xmlns="http://www.w3.org/2001/XMLSchema",targetNamespace="http://www.example.org/FirstSchema" ,elementFormDefault="qualified"是雷打不动,照着抄就对了,eclipse会自动生成
**/
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.example.org/FirstSchema"
elementFormDefault="qualified">
<element name="person"> //表示头标签是person
<complexType> //格式要求
<sequence> //可以用all,choice,any代替
<element name="p"></element>
<element name="p"></element>
</sequence>
</complexType>
</element>
<!-- <all> 不仅限制xml,还限制schema,相同元素只能出现一次 -->
<!-- maxOccurs = "unbounded" 元素可以出现任意次数,写在标签内-->
<element name="p">
<complexType>
<sequence>
<element name="name" type="string"></element>
<element name="age" type="int"></element>
</sequence>
</complexType>
</element>
<!-- <Choice>限制元素只能出现一个 -->
<!-- <any>可写任意元素 -->
</schema>
那么如何用Schema约束XML,看这个实例
//xmlns填写对应的Schema的命名空间targetNamespace后面的字符串
//xmlns:xsi,是对xmlns起的别名,填写对应schema的xmlns后加上-instance,表示这个xml是被约束方
//xsi:schemaLocation里有两个字符串,前一个和xmlns一样,后一个填schema文件的地址
<?xml version="1.0" encoding="UTF-8"?>
<person xmlns="http://www.example.org/FirstSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.example.org/FirstSchema FirstSchema.xsd">
<p>
<name>jiwenlong</name>
<age>21</age>
</p>
<p>
<name>guoxinlei</name>
<age>21</age>
</p>
<p>
<name>popo</name>
<age>23</age>
</p>
</person>
解析器Jaxp
sax缺点增删改困难,优势在于处理对大文件没内存压力;dom优点和缺点与sax相反。
Jaxp下的sax技术
package Xml;
/*
* sax解析:边读边解析,不能增删,可配合判断语句查询,
* SAXParserFactory是解析器工厂,通过静态方法创对象
* SAXParser是解析器,通过静态方法创对象
* saxparer.parse("src/thread.xml",new Mydefault()) 中前一个参数是xml文档的地址,后一个是驱动事件
* parse方法通过Mydefault对象对文档解析
* */
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import javax.xml.parsers.SAXParser;;
public class JaxpSax {
public static void main(String[] args) throws Exception {
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser saxparer = factory.newSAXParser();
saxparer.parse("src/thread.xml",new Mydefault());
}
}
class Mydefault extends DefaultHandler{
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
super.startElement(uri, localName, qName, attributes);
System.out.print("<"+qName+">");
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
// TODO Auto-generated method stub
super.characters(ch, start, length);
System.out.print(new String(ch,start,length));
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
// TODO Auto-generated method stub
super.endElement(uri, localName, qName);
System.out.print("</"+qName+">");
}
}
Jaxp下的dom技术
package Xml;
/*
*最重要的是理记牢解析器的创建使用,和回写
* **/
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.Text;
public class JaxpDom {
public static void main(String[] args) throws Exception {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse("src/Xml/SchemaXml.xml");
Node node = document.getElementsByTagName("p").item(0);
Element school = document.createElement("school");
Text Text = document.createTextNode("aliyun");
school.appendChild(Text);
node.appendChild(school);
TransformerFactory tran = TransformerFactory.newInstance();
Transformer transformer = tran.newTransformer();
transformer.transform(new DOMSource(document), new StreamResult("src/Xml/SchemaXml.xml"));
}
}
解析器Dom4j
需要导入Dom4j包
Dom4j的更新操作
package Dom4j;
/*
* Elemen是接口,是Node的子类
* Dom4j的添加操作
* add1():addElement(qname)方法将qname顺序添加在当前元素的子标签下
* add2():通过DocumentHelper.createElement(qname)操作新建一个标签qname,list.add( ,)在指定位置添加标签
* Dom4j的修改操作
* 可以直接通过setText()修改
* DOm4j的删除操作
* 通过父节点remove()
* **/
import java.io.FileOutputStream;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
public class AddDom4j {
public static void main(String[] args) throws Exception {
add2();
}
public static void add1() throws Exception {
SAXReader saxreader = new SAXReader();
Document document = saxreader.read("src/Xml/SchemaXml.xml");
Element root = document.getRootElement();
Element cite = root.addElement("p");
Element name = cite.addElement("name");
name.setText("popo");
Element age = cite.addElement("age");
age.setText("23");
age.setText("34");
OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter xmlwriter = new XMLWriter(new FileOutputStream("src/xml/SchemaXml.xml"),format);
xmlwriter.write(document);
xmlwriter.close();
}
public static void add2() throws Exception {
Document document = FunctionDom4j.Document(FunctionDom4j.PATH);
Element root = document.getRootElement();
Element p = root.element("p");
List<Element> list = p.elements();
Element school = DocumentHelper.createElement("school");
school.setText("阿里云");
list.add(1, school);
FunctionDom4j.XMLWriter(document,FunctionDom4j.PATH);
}
}
Dom4j的查询操作
/*
* dom4j查询
* element(qname)查询当前标签下第一个叫qname的标签
* elements(qname)查询当前标签下所有叫qname的标签(一层子标签)
* elements()查询当前标签下所有的标签(一层子标签)
* **/
import java.util.Iterator;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class SelectDom4j {
public static void main(String[] args) throws Exception {
Select();
}
public static void Select() throws Exception {
//解析器
SAXReader saxreader = new SAXReader();
//文档
Document document = saxreader.read("src/Xml/SchemaXml.xml");
//根节点
Element root = document.getRootElement();
List<Element> list = root.elements("p");
Iterator<Element> iterator = list.iterator();
while(iterator.hasNext()) {
String str = iterator.next().element("name").getText();
System.out.println(str);
}
}
}
Dom4j对XPATH的支持
需要导入对XPATH支持的特定包
XPATH中查询规则:
- //name 表示查询所有name标签
- //name[@ id = ’ 1’] 表示查询属性值id等于1 的所有name标签
- /person/name 表示查询person标签下的name标签 ,/表示层
- /* 表示所有元素
package Dom4j;
import java.util.*;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
import org.dom4j.util.NodeComparator;
public class XPATHDom4j {
public static void main(String[] args) throws Exception {
selectSingle();
}
public static void selectSingle() throws Exception {
//获取document
SAXReader saxreader = new SAXReader();
Document document = saxreader.read("src/Xml/DTDXml.xml");
List<Node> list = document.selectNodes("//CHANNE[@CHAN='JI']/BANNER");
Iterator<Node> iterator = list.iterator();
while(iterator.hasNext()) {
Node node = iterator.next();
String str = node.getText();
System.out.println(str);
}
}
}