这里的<users>和</users>是根标签,其中的id就是它的属性。
约束
内部dtd
外部dtd
<xsd:element name=“students” type=“studentsType”>: 定义标签,名为students,并且类型为studentsType的自定义类型。
<xsd:complexType name=“studentsType”>:定义自定义类型,名字为studentsType。
<xsd:sequence>:指定按顺序出现
<xsd:element name=“student” type=“studentType” minOccurs=“0” maxOccurs=“unbounded”>: 定义标签,名为student,并且类型为studentType的自定义类型,出现次数最小0次,最多没有限制。
<xsd:complexType name=“studentType”>:定义自定义类型,名字为studentType。
<xsd:sequence>:指定按顺序出现
<xsd:element name=“name” type=“xsd:string”>: 定义标签,名为name,并且类型为字符串类型。
下面对age和sex标签进行定义。
<xsd:attribute name=“number” type=“numberType” use=“required”>:定义属性,名为number,类型为numberType的自定义类型,并且是必须的。
sexType自定义类型是一个简单的类型,并且有限制,基本类型是字符型,两个枚举值为"male"、“female”。
ageType自定义类型是一个简单的类型,并且有限制,基本类型是整型,最小值为0,最大值为256。
numberType自定义类型是一个简单的类型,并且有限制,基本类型是字符型,有正则表达式限制,为"heima_\d{4}"。
解析XML
SAX
DOM
DOM1级主要定义的是HTML和XML文档的底层结构。DOM2和DOM3级则在这个结构的基础上引入了更多的交互能力,也支持更高级的XML特性。DOM2和3级的目的在于扩展DOM API,以满足操作XML的所有需求,实现这一目标的很大程度上意味着对命名空间的支持。有了XML命名空间,不同XML文档的元素就可以混合在一起,共同构成格式良好的文档,而不必担心发生命名冲突。从技术上讲HTML不支持XML命名空间,但XHTML支持XML命名空间。命名空间要使用xmlns特性来指定。XHTML的命令空间是http://www.w3.org/1999/xhtml,在任何格式良好XHTML页面中,都应该将其包含在html元素中。
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Example XHTML page</title>
</head>
<body>
Hello world!
</body>
</html>
对于这个例子而言,其中的所有元素默认都被视为XHTML命名空间中的元素。要想明确地为XML命名空间创建前缀,可以使用xmlns后跟冒号,再后跟前缀。
<xmlns:html xmlns:xmlns="http://www.w3.org/1999/xhtml">
<xmlns:head>
<xmlns:title>Example XHTML page</xmlns:title>
</xmlns:head>
<xmlns:body>
Hello world!
</xmlns:body>
</xmlns:html>
关于DOM中对XML中的支持,后面的博客会详细讲解
Jsoup
student.xml的数据如下:
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.File;
import java.io.IOException;
public class JsoupDemo1 {
public static void main(String[] args) throws IOException {
//2.获取Document对象,根据xml文档获取
//2.1获取student.xml的path
String path = JsoupDemo1.class.getClassLoader().getResource("student.xml").getPath();
//2.2解析xml文档,加载文档进内存,获取DOM树-->Document
Document document = Jsoup.parse(new File(path),"utf-8");
//3.获取元素对象Element
Elements elements = document.getElementsByTag("name");
System.out.println(elements.size());
//3.1获取第一个name的Element对象
Element element = elements.get(0);
//3.2获取数据
String name = element.text();
System.out.println(name);
}
}
//2.获取Document对象,根据xml文档获取
//2.1获取student.xml的path
String path = JsoupDemo1.class.getClassLoader().getResource("student.xml").getPath();
//2.2解析xml文档,加载文档进内存,获取DOM树-->Document
Document document = Jsoup.parse(new File(path),"utf-8");
//3.查询name标签
Elements elements = document.select("name");
System.out.println(elements);
//获取student标签并且number属性值为heima_0001的age子标签
Elements elements2 = document.select("student[number='heima_0001']");
System.out.println(elements2);
Elements elements3 = document.select("student[number='heima_0001']>age");
System.out.println(elements3);
//2.获取Document对象,根据xml文档获取
//2.1获取student.xml的path
String path = JsoupDemo1.class.getClassLoader().getResource("student.xml").getPath();
//2.2解析xml文档,加载文档进内存,获取DOM树-->Document
Document document = Jsoup.parse(new File(path),"utf-8");
//3.创建JXDocument对象
JXDocument jxDocument = new JXDocument(document);
//4.结合xpath语法查询
//4.1查询所有student标签
List<JXNode> jxNodes = jxDocument.selN("//student");
for(JXNode jxNode: jxNodes)
System.out.println(jxNode);
//4.2查询所有student标签下的name标签
List<JXNode> jxNodes2 = jxDocument.selN("//student/name");
for(JXNode jxNode: jxNodes2)
System.out.println(jxNode);
//4.3查询所有student标签下带有id属性的name标签
List<JXNode> jxNodes3 = jxDocument.selN("//student/name[@id]");
for(JXNode jxNode: jxNodes3)
System.out.println(jxNode);
//4.4查询所有student标签下带有id属性的name标签,且id属性值为itcast
List<JXNode> jxNodes4 = jxDocument.selN("//student/name[@id='itcast']");
for(JXNode jxNode: jxNodes4)
System.out.println(jxNode);