1.意义
2.使用场景
3.xml的语法
4.xml的两种约束:DTD,Schema(校验xml正确性)
5.xml的两种解析方式:dom解析,sax解析
1.意义:xml既能操作数据也能保留数据的关系
2.使用场景:
(1).不同系统间的数据交换
(2).用作配置文件
3.xml的语法:文档声明,元素,属性,注释,CDATA,特殊字符,处理指令
文档声明:
<?xml version="1.0" encoding="gbk" standalone="true" ?>
standalone:是否依赖其他文件,true就是不依赖
元素:标签
注释:<!--xxx-->
CDATA(将字符原样输出):<![CDATA[内容]]>
特殊字符:<:< >:> &:& ":" ':'
处理指令:<?xml-stylesheet href="1.css" type="text/css" ?>(通知xml解析引擎用css文件显示xml内容)
4.xml的两种约束:DTD,Schema
(1).校验xml正确性
var xmldoc = new ActiveXObject("MicroSoft.XMLDOM");//xm解析器对象
xmldoc.validateOnParse("true");//开启校验
xmldoc.load("book.xml");
xmldoc.parseError.line;
xmldoc.parseError.reason;
(2).DTD约束(.dtd)
导入DTD约束:
<!DOCTYPE 根元素名称 SYSTEM 地址 >//注:SYSTEM可以换成PUBLIC
<!DOCTYPE 根元素名称 [DTD约束内容]>
语法:
元素:<!ELEMENT 元素名称 元素约束>
^!.元素约束可以为ANY/EMPTY,表示任意都行/约束为空
^2.(#PCDATA):字符串
^3.(逗号分隔子元素),则子元素必须按照括号里的顺序写
^4.(|分隔子元素),则子元素在括号给出的里面随便一个都行
^5.子元素的数量符: +:一次或多次 *:0次或多次 ?:0次或一次
属性:<!ATTLIST 元素名
属性名1 属性类型1 属性约束1
属性名2 属性类型2 属性约束2>
属性类型:CDATA,ID,ENUMRATED,ENTITY
CDATA(字符串)
ID(唯一)
ENUMRATED(枚举)
ENTITY(实体):引用实体(给xml调用的实体),参数实体(给DTD调用的实体)
引用实体:<!ENTITY 实体名 "实体内容">
调用引用实体:&实体名
参数实体:<!ENTITY % 实体名 "实体内容">
调用参数实体:%实体名
属性约束:#REQUIRED,#IMPLIED,#FIXED '固定值','默认值'
#REQUIRED(必须有)
#IMPLIED(可有可无)
#FIXED '固定值'(固定值)
'默认值'
(3).Schema约束:注意理解命名空间(.xsd)
例子:
Schema文件:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="shiporder">
<xs:complexType>
<xs:sequence>
<xs:element name="orderperson" type="xs:string"/>
<xs:element name="shipto">
<xs:complexType>
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="address" type="xs:string"/>
<xs:element name="city" type="xs:string"/>
<xs:element name="country" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
xml文件:
<?xml version="1.0" encoding="utf-8" ?>
<pgg:shiporder xmlns:pgg(名称空间)="www.pgg.com"
xmlns:xsi(著名地址)="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation(名称空间对应的Schema地址)="www.pgg.com ship.xsd">
<pgg:orderperson>aaa</pgg:orderperson>
<pgg:shipto>
<pgg:name>aaa</pgg:name>
<pgg:address>aaa</pgg:address>
<pgg:city>aaa</pgg:city>
<pgg:country>aaa</pgg:country>
</pgg:shipto>
</pgg:shiporder>
5.xml的两种解析方式:dom解析,sax解析
(1).dom解析:
优点:(1)增删改查很方便 (2)一次解析多次使用
缺点:(1)需要先解析才能操作 (2)要存放在内存中,耗内存资源
(2).sax解析
优点:(1)不需要先解析 (2)不需要存放到内存
缺点:(1)只能做查询 (2)解析完只能用一次
(3).dom4j解析xml
^1.获取根节点
SAXReader reader = new SAXReader();
Document doc = reader.read("book.xml");
Element root = doc.getRootElement();
^2.修改
XMLWriter writer = new XMLWriter(new FileOutputStream("book.xml"),OutputFormat.createPrettyPrint());
writer.write(dom);
writer.close();
^3.增
Element booEle = root.element("书");
Element priceEle = DocumentHelper.createElement("价格");
priceEle.setText("40元");
bookEle.add(priceEle);
^4.删
Element priceEle = root.element("书").element("价格");
priceEle.getParent.remove(priceEle);
^5.改
root.element("书").element("价格").setText("20元");
^6.查
List<Element> list = root.elements();
Element ele = list.get(1);
System.out.println(ele.element("书名").getText());
7.设置属性
Element bookEle = root.element("书");
bookEle.addAttribute("出版社","中信出版社");
String str = bookEle.attributeValue("出版社");
(4).sax解析xml
public void main(String[] args) throws Exception{
SAXParserFactory factory = SAXParserFactory.newInstance();//SAX解析器工厂
SAXParser parser = factory.newSAXParser();//SAX解析器
XMLReader reader = parser.getXMLReader();//读取器
reader.setContentHandler(new MyContentHanlder);//注册事件处理器
reader.parse("book.xml");
}
注:事件处理器可以implements ContentHandler,也可以extends DefaultHandler