XML:
xml的全称是可扩展标记语言(eXtensible Markup language)是一种标记语言,用法跟HTML相似,但是语法要求比较严格,而且有配置文件进行约束(dtd、schema),xml的设计是为了进行数据传输,因此语法格式才会很严谨。
优点:
可扩展性、自定义、语法严格
作用:
作为配置文件:常用的配置文件(xml、text、properties);
原因:1、语法严谨,稍有不对就会报错
2、格式可以自定义
为什么xml格式会比较严谨,是因为有先关的约束,约束的书写格式包括两种:dtd和schema
两者的区别:1、dtd易于使用,但是约束性较弱
2、schema语法过于繁琐,但是约束性较强
dtd的引用方式:
1、内部
<?xml version="1.0" encoding="UTF-8" ?>
<! DOCTYPE 根节点 [
<! ELEMENT 元素名(复杂元素/简单元素)>
<! ATTLIST 元素名 属性名 属性值 必要性>
]>
2、本地
<? xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE 根节点 SYSTEM " 约束文件地址">
3、网络
<? xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE 根节点 PUBLIC “网络名称” “DTD文件地址”
schema引入方式
.xsd文件
<?xml version="1.0" encoding="UTF-8"?> <!-- w3c的约束--> <schema xmlns="http://www.w3.org/2001/XMLSchema" <!--自己的约束名称空间--> targetNamespace="http://www.demo2.org/demo2" <!--约束的质量--> elementFormDefault="qualified" > <!--定义元素:element--> <element name="students"> <!--表示复杂元素:complexType--> <complexType> <!--子是否按顺序出现--> <sequence> <element name="student"> <complexType> <sequence> <!--属性名,属性的类型--> <element name="name" type="string"></element> <element name="age" type="int"></element> </sequence> </complexType> </element> </sequence> </complexType> </element> </schema>
引入方式:
<?xml version="1.0" encoding="UTF-8"?> <!--根节点:xmlns:xsi="w3c的约束"--> <students xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" <!--xmlns="自己的约束名称空间"--> xmlns="http://www.demo2.org/demo2" <!--xsi:schemaLocation="约束的空间名 约束地址" xsi:schemaLocation="http://www.demo2.org/demo2 demo2.xsd" > <student> <name>xxx</name> <age>12</age> </student> </students>
解析器
1、JAXP
2、DOM4J
解析方式:
1、SAX:基于时间驱动和事件处理器, 边读边解析
- 不支持增删改,只支持查
- 按行读取,边读取边解析
- 内存占用率小
-
import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import java.io.IOException; public class SAXDemo { public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException { //创建jaxp的sax解析器工厂 SAXParserFactory factory=SAXParserFactory.newInstance(); //获取jaxp的sax解析器 SAXParser parser=factory.newSAXParser(); //解析文件,这里需要提供一个Handler作为任务处理器 parser.parse(Class.class.getResource("/").getPath()+"demo2.xml",new DefaultHandler(){ @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { System.out.println(qName); } @Override public void endElement(String uri, String localName, String qName) throws SAXException { System.out.println(qName); } @Override public void characters(char[] ch, int start, int length) throws SAXException { System.out.println(new String(ch,start,length)); } }); } }
2、DOM解析:
- 整片解析,然后再内容中生成树结构
- 可以进行增删改查
- 内存占用率较大,容易造成内存溢出
-
import org.w3c.dom.Document; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; public class DOM { public static void main(String[] args) throws Exception { DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance(); DocumentBuilder builder=factory.newDocumentBuilder(); Document document = builder.parse("src/demo2.xml"); NodeList student = document.getElementsByTagName("student"); for (int i = 0; i <student.getLength(); i++) { Node node = student.item(i); NodeList nodes = node.getChildNodes(); for (int j = 0; j <nodes.getLength() ; j++) { Node node1 = nodes.item(j); System.out.println(node1.getTextContent()); } } } }