xml文件解析
一:解析xml文件
操作步骤:
1)导入jar包(dom4j-1.6.1.jar和jaxen-1.1-beta-6.jar)
2)创建核心类SAXReader();
SAXReader sax=new SAXReader()
3)将xml文件加载到内存中形成一棵树。
Document doc=sax.read(String path)
4)获取根节点
Element rootel=doc.
getRootElement()
5)通过根节点就可以获取其他的节点。(文本节点,属性节点,元素节点)
List<element> els=rootel.ements();//获取所有的节点。
遍历els获取每个节点
String elementText(String name)---文本。
String attributeValue(String name)---获取节点的属性值。
1 package jd.com.dealxml; 2 3 import org.dom4j.Document; 4 import org.dom4j.Element; 5 import org.dom4j.io.SAXReader; 6 7 import java.util.List; 8 9 public class xml_Deal { 10 public static void main(String ... args)throws Exception{ 11 SAXReader SX=new SAXReader(); 12 Document doc=SX.read("D:\\workflow\\refect\\src\\jd\\com\\dealxml\\test.xml"); 13 Element root_el=doc.getRootElement(); 14 System.out.println(root_el.attributeValue("version"));//获取根节点的属性。 15 List<Element> el_list=root_el.elements();//获取所有的节点。 16 for(Element el:el_list){ 17 System.out.println(el.elementText("nb")); 18 System.out.println(el.attributeValue("class"));//存在的属性,没有返回null。 19 } 20 } 21 }
结果:
1 2.0 2 hi 3 null 4 hi 5 null
xpath解析技术:(推荐使用)
上面的方法获取的xml的属性和文本的时候,想要获取特定的标签的属性和文本的值时候会很麻烦,于是导入jar包:jaxen-1.1-beta-6.jar
依赖dom4j
操作步骤:
1)导入jar包(包含dom4j和jaxen)
2)加载xml文件到内存中。
3)使用API
selectNode("表达式") 返回是list集合。
selectSingalNode("表达式" ) 返回单个节点。
表达式 查看xml文档
表达式:
- nodename(节点名称):表示选择该节点的所有子节点
- "/":表示选择根节点
- "//":表示选择任意位置的某个节点
- "@": 表示选择某个属性
例子:
<?xml version="1.0" encoding="ISO-8859-1"?> <bookstore> <book> <title lang="eng">Harry Potter</title> <price>29.99</price> </book> <book> <title lang="eng">Learning XML</title> <price>39.95</price> </book> </bookstore>
1 [例1] 2 3 bookstore :选取 bookstore 元素的所有子节点。 4 5 [例2] 6 7 /bookstore :选取根节点bookstore,这是绝对路径写法。 8 9 [例3] 10 11 bookstore/book :选取所有属于 bookstore 的子元素的 book元素,这是相对路径写法。 12 13 [例4] 14 15 //book :选择所有 book 子元素,而不管它们在文档中的位置。 16 17 [例5] 18 19 bookstore//book :选择所有属于 bookstore 元素的后代的 book 元素,而不管它们位于 bookstore 之下的什么位置。 20 21 [例6] 22 23 //@lang :选取所有名为 lang 的属性。
代码实现:
1 package jd.com.dealxml; 2 3 import org.dom4j.Document; 4 import org.dom4j.Element; 5 import org.dom4j.Node; 6 import org.dom4j.io.SAXReader; 7 8 import java.util.List; 9 10 public class xml_Deal { 11 public static void main(String ... args)throws Exception{ 12 SAXReader SX=new SAXReader(); 13 Document doc=SX.read("D:\\workflow\\refect\\src\\jd\\com\\dealxml\\test.xml"); 14 Element root_el=doc.getRootElement(); 15 System.out.println(root_el.attributeValue("version"));//获取根节点的属性。 16 List<Element> el_list=root_el.elements();//获取所有的节点。 17 for(Element el:el_list){ 18 System.out.println(el.elementText("nb")); 19 System.out.println(el.attributeValue("class"));//存在的属性,没有返回null。 20 } 21 xpat_Demo(); 22 } 23 static void xpat_Demo()throws Exception{ 24 Document doc=new SAXReader().read("D:\\workflow\\refect\\src\\jd\\com\\dealxml\\test.xml"); 25 Node no_li=doc.selectSingleNode("/bea/ba-name/nc");//绝对路径获取。 26 Node no_1=doc.selectSingleNode("//nc");//所有匹配。 27 Node no_2=doc.selectSingleNode("//@version"); 28 //获取指定属性值://title[@lang='eng'] 表示选择所有lang属性的值等于"eng"的title节点。 29 Node no_3=doc.selectSingleNode("//bea[@version='2.0'] "); 30 System.out.println(no_3.getName()); 31 System.out.println(no_2.getStringValue());//获取指定的属性值。 32 System.out.println(no_1.getText()); 33 System.out.println(no_li.getText()); 34 35 List<Node> no3=doc.selectNodes("//nc");//获取所有nc节点的标签 selectNodes返回的匹配的标签的list集合。 36 for(Node no:no3){System.out.println(no.getText());} 37 38 } 39 }
注意:
document 继承Branch 而Branch 继承Node,所以document 实现类的对象继承Node方法,所以document的对象可以 直接调用selectNodes和selectsignalNode方法!!!
- public interface Document extends Branch
- public interface Branch extends Node