解释:
*代表多个,一个students结点下面有多个student结点,ELEMENT放在最上面代表students是根结点
一个student结点下可以放一个name结点,一个age结点,一个sex结点,且按此顺序不能乱!
PCDATA是文本的意思,即name结点里放的是文本,下面的age,sex同理
student结点有个ID类型的number属性 ,且ID不能重复,#REQUIRED代表必须。
按照如上约束写的student.xml:
enumeration是枚举类型,意思是只有那几个枚举选项可以选择。
\d是数字的意思,所以\d{4}是四位是四位数字的意思。
targetNamespace是域名空间。
student.xsd:
按照如上约束写的student.xml:
Java开发中DOM用的比较多,SAX在手机APP中用的比较多。
DOM比较占内存,因为每个结点都要的生成一个Java对象;而SAX是一行一行读取,故只存一行的数据对象,所以不占内存。
bug:
获取绝地路径时遇到的一个bug,报了找不到系统指定文件的异常,我看了下我的路径中有个文件名称是Idea 2019,而中间的空格却被解析成了%20
解决办法,参考这篇文章
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 Demo1 {//获取XML中所有的学生姓名public static void main(String[] args) throws IOException {/*(2) 加载 XML 文档进内存,获取 DOM 树对象 Document2.1找到XML文档的绝对路径利用类加载器,通过项目中文件的相对路径找到硬盘中的绝对路径*///类加载器ClassLoader classLoader=Demo1.class.getClassLoader();//获得绝对路径//用replace将因路径中有空格而出现的%20还原为原来的空格String path=classLoader.getResource("com/baizhan/xml/xsd/student.xml").getPath().replace("%20"," ");//System.out.println(path);//2.2根据XML文档的路径,把XML文档加载进内存,并解析成Dom树对象Document document= Jsoup.parse(new File(path),"utf-8");//输出的文件内容是html文档,因为jsoup最开始是解析html文档的,所以解析式把document对象封装成html文档//System.out.println(document);/*(3) 获取对应的标签 Element 对象方法和js差不多*///Elements是Element的一个集合//根据标签名获得标签时,加了前缀不要忘记写前缀Elements name=document.getElementsByTag("a:name");//(4) 获取数据for (Element element:name){String text=element.text();System.out.println(text);}}
}
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;import java.io.File;
import java.io.IOException;
import java.net.URL;public class Demo2 {public static void main(String[] args) throws IOException {//解析本地文件//获得绝对路径
// String path=Demo2.class.getClassLoader().getResource(
// "com/baizhan/xml/xsd/student.xsd").getPath().replace("%20"," ");
// Document document= Jsoup.parse(new File(path),"utf-8");
// System.out.println(document);//解析字符串
// Document document1=Jsoup.parse("
// "
// "
// "
// "
// "
// "
// "
// "
// "
// System.out.println(document1);//解析网络资源//第一个参数是访问的网络地址,第二个参数是最大等待时间,超过这个时间就默认是访问超时Document document=Jsoup.parse(new URL("http://www.baidu.com"),5000);//5sSystem.out.println(document);}
}
student.xml:
Demo3.java :
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 Demo3 {public static void main(String[] args) throws IOException {String path=Demo3.class.getClassLoader().getResource("com/baizhan/xml/jsoup/student.xml").getPath().replace("%20"," ");Document document= Jsoup.parse(new File(path),"utf-8");//根据 id 获取元素Element element1=document.getElementById("a1");System.out.println(element1.text());System.out.println("-----------------------");//根据标签名获取元素Elements elements=document.getElementsByTag("age");for (Element element:elements){System.out.println(element.text());}System.out.println("-----------------------");//根据属性获取元素Elements elements1=document.getElementsByAttribute("number");for (Element element:elements1){System.out.println(element);}System.out.println("-----------------------");//根据属性名 =属性值获取元素Elements elements2=document.getElementsByAttributeValue("number","baizhan_0001");for (Element element:elements2){System.out.println(element);}System.out.println("------------------------------------------");//根据选择器选取元素(速度最快)//css中根据id来选Elements elements3=document.select("#a1");//text()就是标签内的值System.out.println(elements3.text());System.out.println("-----------------------");//css中根据class来选Elements elements4=document.select(".hh");System.out.println(elements4);System.out.println("-----------------------");//css中根据标签名来选Elements elements5=document.select("name");System.out.println(elements5);}
}
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 Demo4 {public static void main(String[] args) throws IOException {String path=Demo4.class.getClassLoader().getResource("com/baizhan/xml/jsoup/student.xml").getPath().replace("%20"," ");Document document= Jsoup.parse(new File(path),"utf-8");Elements elements=document.getElementsByAttributeValue("number","baizhan_0001");for (Element element:elements){//获取元素包含的纯文本System.out.println(element.text());System.out.println("------------------------");//获取元素包含的带标签的文本System.out.println(element.html());System.out.println("------------------------");//获取元素的属性值。System.out.println(element.attr("number"));}}
}
import cn.wanghaomiao.xpath.exception.XpathSyntaxErrorException;
import cn.wanghaomiao.xpath.model.JXDocument;
import cn.wanghaomiao.xpath.model.JXNode;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;import java.io.File;
import java.io.IOException;
import java.util.List;public class XPathDemo {public static void main(String[] args) throws IOException, XpathSyntaxErrorException {//2. 获取 Document 对象String path=XPathDemo.class.getClassLoader().getResource("com/baizhan/xml/jsoup/student.xml").getPath().replace("%20"," ");Document document= Jsoup.parse(new File(path),"utf-8");// 3. 将 Document 对象转为 JXDocument 对象JXDocument jxDocument=new JXDocument(document);// 4. cn.wanghaomiao.xpath.model.JXDocument 调用 selN(String xpath),获取 List
}