解析的目的就是为了获取元素里面的字符数据或者属性数据
1.解析方式
-
DOM(Document Object Model)
把整个xml全部读到内存中,形成树状结构。整个文档称之为document对象,属性对应attribute对象,所有的元素结点对element对象,文本也可以称之为text对象,以上所有的对象都可以称之为node结点。
优:可以对文档进行增删操作
缺:如果文档过大,内存可能会溢出。 -
SAX(Sample API for XML)
读取一行,解析一行。
优:不会造成内存溢出
缺:不可以进行增删,只能查询。
根据以上两种方式给出的解决方案
dom4j、jaxp、jdom
2.dom4j
dom4j解析步骤:
1.创建SAXReader对象
2.指定解析的xml
3.获取根元素
4.根据根元素获取子元素或者子孙元素。
dom.xml代码
<?xml version="1.0" encoding="UTF-8"?>
<stus>
<stu>
<name>李明</name>
<age>13</age>
<address>北京</address>
</stu>
<stu>
<name>小红</name>
<age>14</age>
<address>上海</address>
</stu>
</stus>
Demo_XML.java文件
public class Demo_XML {
public static void main(String[] args) throws DocumentException {
try {
//1.创建sax读取对象
SAXReader reader=new SAXReader();
//2.制定解析的xml源
Document document=reader.read(new File("src/xml/demo.xml"));
//3.得到元素
Element rootElement=document.getRootElement();
//System.out.println(rootElement.element("stu").element("age").getText());
List<Element> elements=rootElement.elements();
for (Element element : elements) {
String nameString=element.element("name").getText();
String ageString=element.elementText("age");
String addressString=element.elementText("address");
System.out.println("name="+nameString+",age="+ageString+",address="+addressString);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
解析结果
3.Xpath
dom.xml和上个一样
public class Demo_Xpath {
public static void main(String[] args) {
try {
//1.创建sax读取对象
SAXReader reader=new SAXReader();
//2.制定解析的xml源
Document document=reader.read(new File("src/xml/demo.xml"));
//3.得到元素
Element rootElement=document.getRootElement();
Element nameElement=(Element)rootElement.selectSingleNode("//name");
System.out.println(nameElement.getText());
System.out.println("——————————————————————");
List<Element> list=rootElement.selectNodes("//name");
for (Element element : list) {
System.out.println(element.getText());
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}