XML解析方式:
-
DOM方式:将标记语言文档一次性加载到内存中,在内存中形成一DOM树的树形结构
- 优点:操作方式简单,可以对文档很轻易的进行CRUD操作,与JS操作DOM方式几乎一样
- 缺点:占用内存太大,特别消耗资源
-
XML的常见解析器:
- JAxp
- DOM4J
- Jsoup。
- 当然还有其他这里不一一列举了
-
选用Jsou解析器做演示。
使用步骤:
-
导包肯定就不用说了吧
-
加载XML或者HTML文档,生成Document对象。
下面是Jsoup文档中的内容:
static Document
parse(File in, String charsetName)
将文件的内容解析为HTML。 static Document
parse(File in, String charsetName, String baseUri)
将文件的内容解析为HTML。 static Document
parse(InputStream in, String charsetName, String baseUri)
读取输入流,并将其解析为文档。 static Document
parse(InputStream in, String charsetName, String baseUri, Parser parser)
读取输入流,并将其解析为文档。 static Document
parse(String html)
将HTML解析为文档。 static Document
parse(String html, String baseUri)
将HTML解析为文档。 static Document
parse(String html, String baseUri, Parser parser)
使用提供的解析器将HTML解析为文档。 static Document
parse(URL url, int timeoutMillis)
获取一个URL,并将其解析为HTML。 -
获取Element对象,根据Document对象或者Element对象获取Element对象,常用方法如下。
Element
getElementById(String id)
按ID查找元素,包括或在此元素下。 Elements
getElementsByAttribute(String key)
查找具有命名属性集的元素。 Elements
getElementsByAttributeStarting(String keyPrefix)
查找具有以提供的前缀开头的属性名称的元素。 Elements
getElementsByAttributeValue(String key, String value)
查找具有特定值的属性的元素。 Elements
getElementsByClass(String className)
查找具有此类的元素,包括或在此元素下。 Elements
getElementsByTag(String tagName)
使用指定的标记名查找元素,包括和递归地在该元素下查找元素。 注意:返回值为Elements其本质是一个对象集合,可以看做ArrayList
-
获取想要的数据
String
html()
检索元素的内部HTML。 Element
html(String html)
设置此元素的内部HTML。 T
html(T appendable)
将此节点及其子节点写入给定的 Appendable
.String
id()
弄到 id
元素的属性。 -
Element的增删改,就不赘述了,可以去查找Jsoup文档。
-
-
代码演示:
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; import java.net.URL; /** * 通过Jsoup解析XML文档 */ public class JsoupParse { public static void main(String[] args) { Document document = loadXml(); //System.out.println(document); //得到所有的student标签 Elements student = getStudent(document); for (Element element : student) { System.out.println(element); System.out.println("---------------"); } //得到student标签中的第一个的text的值 getTagText(student.get(0)); System.out.println("---------------"); //得到第一个student标签的下的name标签 Elements name = student.get(0).getElementsByTag("name"); System.out.println(name); System.out.println("---------------"); //得到某个标签指定属性的值 String id = name.attr("id"); System.out.println(id); System.out.println("---------------"); //设置某个元素指定属性的值 name.attr("id","100000"); System.out.println(name); } /** * 得到标签中的值 * @param element */ private static void getTagText(Element element) { String text = element.text(); System.out.println(text); //远 21 男 } /** * 得到所有的student标签元素 * @param document 传入Document对象 * @return Elements 返回一个Elements对象 */ private static Elements getStudent(Document document) { Elements student = document.getElementsByTag("student"); return student; } private static Document loadXml() { //加载XML文件 ClassLoader classLoader = JsoupParse.class.getClassLoader(); URL resource = classLoader.getResource("student.xml"); String path = resource.getPath(); //形成Document对象 Document document = null; try { document = Jsoup.parse(new File(path),"utf-8"); } catch (IOException e) { e.printStackTrace(); } return document; } }
结果如下:
<student> <name id="1001"> 远 </name> <age> 21 </age> <sex> 男 </sex> </student> --------------- <student> <name id="1002"> 悦 </name> <age> 20 </age> <sex> 女 </sex> </student> --------------- 远 21 男 --------------- <name id="1001"> 远 </name> --------------- 1001 --------------- <name id="100000"> 远 </name> Process finished with exit code 0
-
本次测试使用的XML内容:
<?xml version="1.0" encoding="UTF-8"?> <!--<?xml-stylesheet type="text/css" href="a.css" ?>--> <students> <student> <name id="1001">远</name> <age>21</age> <sex>男</sex> </student> <student> <name id="1002">悦</name> <age>20</age> <sex>女</sex> </student> </students>