XML之dom4j
dom4j解析xml文档的大致步骤
第一步. 使用 org.dom4j.io.SAXReader 类的read(String fileName)方法读取并解析xml文档,返回org.dom4j.Document 接口的一个对象;
<!-- lang: java -->
// 实例化SAXReader对象,调用read()方法读取XML文档,返回XML文档 SAXReader reader = new SAXReader(); Document doc = reader.read(new File(fileName)); 第二步.取得根节点,返回org.dom4j.Element 接口的一个对象;
<!-- lang: java --> //获取ROOT(根)节点 Element root = doc.getRootElement(); 第三步 . 遍历XML树(枚举(Iterator)、递归 、Visitor模式),上面的代码用了下面的方式实现。
<!-- lang: java -->
// 枚举所有子节点 for ( Iterator i = root.elementIterator(); i.hasNext(); ) { Element el = (Element) i.next(); // do something } ============ 结合上面的实例整理一些dom4j解析xml的常用API ===============
获取子节点的两种方法:element(String name)和elements(String name)
1 . 文档中 price 、description 、calories 这三个标签在根节点中的名称都是唯一的,因此可以用element();
<!-- lang: java --> //获取<price> 、<description> 、<calories>节点 Element price = el.element("price"); Element calories = el.element("calories"); Element description = el.element("description"); 2 . 而 name 标签在根节点下并不是唯一的,需要用elements(),并且用List接受
<!-- lang: java --> //获取所有<name>节点 List<Element> list = el.elements("name"); org.dom4j.Element接口下几个常用方法;
1 . getName()方法,用于返回节点名称。
<!-- lang: java --> //取得<price>的节点名 Element price = el.element("price"); System.out.println("标签名为:"+price.getName()); //结果为:price 2 . getText() 方法 ,用于返回节点值。
<!-- lang: java --> //取得<price>的节点值 Element price = element.element("price"); System.out.println("该节点值为:"+price.getText()); //第一次结果为:$1.95 3 . attributes方法, 返回该元素的属性列表
<!-- lang: java --> //取得<calories unit="kCal">中的属性列表,若有多个用get(i)依次获取 Element calories = element.element("calories"); Attribute ca = (Attribute) calories.attributes().get(0); //取得第一个节点属性 4 . attributeValue(String name),根据传入的属性名获取属性值
<!-- lang: java --> //取得<calories unit="kCal">中的unti属性的值 Element calories = element.element("calories"); System.out.println("属性unit的值为:"+calories.attributeValue("unit"));//结果为:kCal 5 . getParent(),返回一个父元素
<!-- lang: java -->
Element description = el.element("description"); System.out.println("该父元素为:"+description.getParent().getName()); //结果为food org.dom4j.Attribute 接口下的两个方法;
1 . getName() 获取属性名 getValue() 获取属性值
<!-- lang: java --> //获取<calories unit="kCal">中的属性名和属性对应的值 Element calories = el.element("calories "); Attribute ca =(Attribute)calories.attributes().get(0); System.out.println(ca.getName()+":"+ca.getValue()); 第一次结果为:unit:kCal
例一XML: <?xml version="1.0" encoding="GB2312"?> <RESULT> <VALUE> <NO>A1234</NO> <ADDR>四川省XX县XX镇XX路X段XX号</ADDR> </VALUE> <VALUE> <NO>B1234</NO> <ADDR>四川省XX市XX乡XX村XX组</ADDR> </VALUE> </RESULT> java: package www.yq.com.src; import java.io.File; import java.util.Iterator; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.SAXReader; /** * @Project XMLSimpleTest * @File MyDom4jXmlReader.java * @Package www.yq.com.src * @Date 2016年1月26日 上午11:52:01 * @Author * @email */ public class MyDom4jXmlReader { public static void main(String[] args) throws DocumentException { File f = new File("E:qi.xml"); SAXReader reader = new SAXReader(); Document document = reader.read(f); Element rootElement = document.getRootElement(); for (Iterator iterator = rootElement.elementIterator(); iterator.hasNext();) { Element node = (Element) iterator.next(); System.out.println("车牌号:"+node.elementText("NO")); System.out.println("车牌地址:"+node.elementText("ADDR")); } } } 例二: <!-- lang: xml --> <?xml version="1.0" encoding="GBK"?> <breakfast_menu> <!--这是根节点--> <food> <name>hamburger</name> <name>汉堡包</name> <price currency="dollar">$1.95</price> <description>A sandwich made with a patty bun......</description> <calories unit="kCal">260</calories> </food> <food> <name>Strawberry Belgian Waffles</name> <name>华夫饼 </name> <price currency="dollar">$7.95</price> <description>light Belgian waffles covered...</description> <calories unit="kCal">900</calories> </food> <food> <name>Berry-Berry Belgian Waffles</name> <name>不知道什么鸟东西 </name> <price currency="dollar">$8.95</price> <description>为了美观描述就写少点了 ......</description> <calories unit="kCal">900</calories> </food> </breakfast_menu>
<!-- lang: java --> import java.io.File; import java.util.Iterator; import java.util.List; import org.dom4j.Attribute; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.io.SAXReader; public class Dom4jTest { public static void main(String[] args) throws Exception { // 从文件读取XML,输入文件名,返回XML文档 File file = new File("E:"+File.separator+"001.xml"); SAXReader reader = new SAXReader(); Document doc = reader.read(file); Element root = doc.getRootElement(); //获取根节点
for (Iterator i = root.elementIterator(); i.hasNext(); ) { Element el = (Element) i.next();
List<Element> list = el.elements("name"); System.out.println(list.get(0).getName()+":"+list.get(0).getText()); System.out.println(list.get(1).getName()+":"+list.get(1).getText());
Element price = el.element("price"); System.out.println("标签名为:"+price.getName()); System.out.println("该节点值为:"+price.getText());
Element description = el.element("description"); System.out.println("该父元素为:"+description.getParent().getName()); System.out.println(description.getNodeType());
Element calories = el.element("calories"); Attribute ca = (Attribute) calories.attributes().get(0); //取得节点属性 System.out.println(ca.getName()+":"+ca.getValue()); System.out.println("属性unit的值为:"+calories.attributeValue("unit"));
System.out.println("========================="); } } } (编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|