Schema
schema约束
schema符合xml的语法,xml语句
一个xml中可以有多个schema,多个schema使用名称空间区分(类似于java包名)
dtd里面有PCDATA类型,但是在schema里面可以支持更多的数据类型
schema可以直接定义一个整数类型
schema语法更加复杂,schema目前不能替代dtd
快速入门
xmlns="http://www.w3.org/2001/XMLSchema" 约束文件
targetNamespace="http://www.example.org/1" 引入约束文件是使用这个地址url地址
xmlns:tns="http://www.example.org/1"
elementFormDefault="qualified"
判断简单元素还是复杂元素<complexType><sequence>
子元素<element name="name" type="string"></element>
被约束文件
在根节点里面xmls:xsi="...-instance"
xmlsn="targetNamespace"
schemaLocation="targetNamespace 路径地址"
<sequence>表示元素出现的顺序
<all>表示元素只能出现一次
<choice>只能出现其中一个
maxOccurs=“unbounded” 表示元素出现的次数
<any></any>表示任意元素
可以约束属性
写在复杂元素里面
写在</complexType>之前
<attribute name="id1" type="int" use="required"></attribute>
sax解析的原理
自动执行事件
starteElement
characters
endElement
package cn.itcast.personTest;
import java.io.IOException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class SaxP1Test01 {
public static void main(String[] args) throws Exception {
SAXParserFactory saxparderfactory = SAXParserFactory.newInstance();
SAXParser saxparser = saxparderfactory.newSAXParser();
saxparser.parse("src/p1.xml", new MyDefault());
}
}
class MyDefault extends DefaultHandler {
boolean flag = false;
int index = 0;
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
if ("name".equals(qName) && index == 0) {
flag = true;
}
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
if (flag) {
System.out.println(new String(ch, start, length));
}
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
if (flag) {
flag = false;
index++;
}
}
}
class MyClass1 extends DefaultHandler {
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
System.out.print("<" + qName + ">");
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
System.out.print(new String(ch, start, length));
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
System.out.print("</" + qName + ">");
}
}
dom4j
不是javase的一部分
package cn.itcast.dom4j.test;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class Dom4jTest01 {
public static void main(String[] args) throws Exception {
showSecond();
}
public static void showSecond() throws Exception {
SAXReader saxReader = new SAXReader();
Document document = saxReader.read("src/p1.xml");
Element root = document.getRootElement();
List<Element> p1 = root.elements("p1");
Element pp = p1.get(1);
Element name1 = pp.element("name");
String s = name1.getText();
System.out.println(s);
}
}
分析:
1、创建解析器SAXReader
2、对xml文件read()解析后产生一个document
3、将文件解析后通过getRootElement()得到根节点
4、根据根节点通过elements()得到标签数组
5、通过数组下标get()方法得到第二个标签的element
6、再根据element()得到这个标签下的第一个name标签的element
7、最后getText()得到文本内容