XPath遍历输出XML所有叶子节点

转载 2013年11月29日 13:25:05

XPath 是一门在 XML 文档中查找信息的语言。XPath 可用来在 XML 文档中对元素和属性进行遍历。

XPath 是 W3C XSLT 标准的主要元素,并且 XQuery 和 XPointer 都构建于 XPath 表达之上。

W3School 提供了详细的XPath教程。http://www.w3school.com.cn/xpath/


本文所展示的遍历算法参考自其他博客,由于不能确定原博主,故没有注明出处,特此说明。


本算法实现遍历输出XML所有叶子节点的path, value, attribute。

本文所用XML文档来自W3School示例文档books.xml。

<!--   Copyright w3school.com.cn  -->
<!--  W3School.com.cn bookstore example  -->
<bookstore>
    <book category="children">
        <title lang="en">Harry Potter</title>
        <author>J K. Rowling</author>
        <year>2005</year>
        <price>29.99</price>
    </book>
    <book category="cooking">
        <title lang="en">Everyday Italian</title>
        <author>Giada De Laurentiis</author>
        <year>2005</year>
        <price>30.00</price>
    </book>
    <book category="web" cover="paperback">
        <title lang="en">Learning XML</title>
        <author>Erik T. Ray</author>
        <year>2003</year>
        <price>39.95</price>
    </book>
    <book category="web">
        <title lang="en">XQuery Kick Start</title>
        <author>James McGovern, Per Bothner, Kurt Cagle</author>
        <year>2003</year>
        <price>49.99</price>
    </book>
</bookstore>

Java方法代码:

public class XmlUtil {

	/**
	 * 读取并解析XML文档
	 * 从文件读取XML,输入文件名,返回XML文档
	 * @param fileName
	 * @return XML文档
	 * @throws DocumentException
	 */
	public Document read(String fileName) throws DocumentException {
		SAXReader reader = new SAXReader();
		Document document = reader.read(new File(fileName));
		return document;
	}
	
	
	/**
	 * 获取节点所有属性值
	 * @param element
	 * @return
	 */
	public String getNodeAttribute(Element element) {
		String xattribute = "";
		DefaultAttribute e = null;
		List list = element.attributes();
		for (int i = 0; i < list.size(); i++) {
			e = (DefaultAttribute) list.get(i);
			//xattribute += " [name = " + e.getName() + ", value = " + e.getText() + "]";
			xattribute += " " + e.getName() + "=" + "\"" + e.getText() + "\"" ;
		}
		return xattribute;
	}
	
	/**
	 * 递归遍历方法
	 * 
	 * @param element
	 * @return
	 */
	public ArrayList getElementList(Element element, ArrayList elemList) {
		//ArrayList<Leaf> elemList = new ArrayList<Leaf>();
		List elements = element.elements();
		if(elements.size() == 0) {
			//没有子元素
			String xpath = element.getPath();
			String value = element.getTextTrim();
			elemList.add(new Leaf(getNodeAttribute(element), xpath, value));
		} else {
			//有子元素
			Iterator it = elements.iterator();
			while (it.hasNext()) {
				Element elem = (Element) it.next();
				//递归遍历
				getElementList(elem, elemList);
				
			}
		}
		return elemList;
	}
	
	
}
测试代码:

public class testXmlUtil {

	/**
	 * @param args
	 */
	@SuppressWarnings("unchecked")
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		//存储xml元素信息的容器    
	    ArrayList<Leaf> elemList = new ArrayList<Leaf>();  
	    XmlUtil util = new XmlUtil();
	    try {
			Document document = util.read("xmlResource/books.xml");
			//测试遍历xml所有子节点
			//获取xml根元素
			Element root = document.getRootElement();
			elemList = util.getElementList(root, elemList);
			String x = getListString(elemList);
			//System.out.println(elemList.get(1).getXpath() + elemList.get(1).getValue());
			System.out.println("-----------原xml内容------------\n" + root.asXML());
			System.out.println("-----------解析结果------------\n" + x);
			
			//测试输出节点所有属性值
			Node node = document.selectSingleNode("/bookstore/book[1]");
			System.out.println("-----------节点所有属性值------------\n" + util.getNodeAttribute((Element) node));
		} catch (DocumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	    	
	}
	
	//自定义输出方法
	public static String getListString(List elemList) {
		StringBuffer sb = new StringBuffer();
		for (Iterator it = elemList.iterator(); it.hasNext();) {
			Leaf leaf = (Leaf) it.next();
			sb.append("xpath:" + leaf.getXpath()).append(", value:").append(leaf.getValue());
			if(!"".equals(leaf.getXattribute())) {
				sb.append(", Attribute: ").append(leaf.getXattribute());
			}
			sb.append("\n"); 
		}
		return sb.toString(); 
	}

}

XML节点数据结构:

/**
 * xml节点数据结构
 * @author 
 *
 */
public class Leaf {

	//节点属性
	private String xattribute;
	//节点path
	private String xpath;
	//节点值
	private String value;
	public Leaf(String xattribute, String xpath, String value) {
		super();
		this.xattribute = xattribute;
		this.xpath = xpath;
		this.value = value;
	}
	public String getXattribute() {
		return xattribute;
	}
	public void setXattribute(String xattribute) {
		this.xattribute = xattribute;
	}
	public String getXpath() {
		return xpath;
	}
	public void setXpath(String xpath) {
		this.xpath = xpath;
	}
	public String getValue() {
		return value;
	}
	public void setValue(String value) {
		this.value = value;
	}


输出结果:

-----------原xml内容------------
<bookstore>
    <book category="children">
        <title lang="en">Harry Potter</title>
        <author>J K. Rowling</author>
        <year>2005</year>
        <price>29.99</price>
    </book>
    <book category="cooking">
        <title lang="en">Everyday Italian</title>
        <author>Giada De Laurentiis</author>
        <year>2005</year>
        <price>30.00</price>
    </book>
    <book category="web" cover="paperback">
        <title lang="en">Learning XML</title>
        <author>Erik T. Ray</author>
        <year>2003</year>
        <price>39.95</price>
    </book>
    <book category="web">
        <title lang="en">XQuery Kick Start</title>
        <author>James McGovern, Per Bothner, Kurt Cagle</author>
        <year>2003</year>
        <price>49.99</price>
    </book>
</bookstore>
-----------解析结果------------
xpath:/bookstore/book/title, value:Harry Potter, Attribute:  lang="en"
xpath:/bookstore/book/author, value:J K. Rowling
xpath:/bookstore/book/year, value:2005
xpath:/bookstore/book/price, value:29.99
xpath:/bookstore/book/title, value:Everyday Italian, Attribute:  lang="en"
xpath:/bookstore/book/author, value:Giada De Laurentiis
xpath:/bookstore/book/year, value:2005
xpath:/bookstore/book/price, value:30.00
xpath:/bookstore/book/title, value:Learning XML, Attribute:  lang="en"
xpath:/bookstore/book/author, value:Erik T. Ray
xpath:/bookstore/book/year, value:2003
xpath:/bookstore/book/price, value:39.95
xpath:/bookstore/book/title, value:XQuery Kick Start, Attribute:  lang="en"
xpath:/bookstore/book/author, value:James McGovern, Per Bothner, Kurt Cagle
xpath:/bookstore/book/year, value:2003
xpath:/bookstore/book/price, value:49.99

-----------节点所有属性值------------
 category="children"



相关文章推荐

xPath技术快速定位节点

xPath技术快速定位节点xPath技术快速定位节点 xPath技术概览 为何使用xPath技术 xPath技术解决的问题 xPath本质 在dom4j中使用xPath技术 xPath语法 xPath...
  • jpzhu16
  • jpzhu16
  • 2016年06月12日 22:58
  • 2553

xpath选择当前结点的子节点

在通过selenium使用xpath选择节点的时候,可能会遇到这么一种情况:在指定的当前节点下搜索满足要求的节点。node = driver.find_element_by_xpath("//div[...

xpath获取子孙元素

目的:通过xpath获取子孙元素中某种属性的元素 前言:在appium的定位中,通过resourceId,name只能获取某一个或几个同种属性的元素。要想获取某一个节点下的所有元素,有什么方法呢。这里...
  • aduocd
  • aduocd
  • 2016年04月05日 16:29
  • 1822

XPATH的几个常用函数

1.contains (): //div[contains(@id,'in')] ,表示选择id中包含有’in’的div节点 2.text():由于一个节点的文本值不属于属性,比如“baidu”,所...

xpath 获取当前节点的父节点,兄弟节点的方法

xpath_input_exp_mark = '//label[contains(text(), "文本内容")]/../following-sibling::div[1]//input'browse...

解决:xpath取出指定多标签内所有文字text

Python 2.7 Pycharm 5.0.3问题 再写一个markdown自动引用的小脚本的时候新出现的问题,也就是利用xpath取出字符串的问题,记录一下 取出如下字符串我要取出mrlev...

Dom4j使用Xpath语法读取xml节点

dom 使用xPath语法

使用XPATH查找xml文档节点

转自:http://blog.csdn.net/shanzhizi/article/details/8822166 ==========================================...

PHP DOMXpath 查询表达式详解

XPath简介 XPath是W3C的一个标准。它最主要的目的是为了在XML1.0或XML1.1文档节点树中定位节点所设计。目前有XPath1.0和XPath2.0两个版本。其中Xpath1.0是19...

dom4j中使用xpath解析带命名空间的xml文件,取不到节点的解决办法

XML文件如下: test class 解析代码如下:public static void main(String [] args){ Document document = XmlTool...
  • fm2005
  • fm2005
  • 2009年04月14日 23:05
  • 4503
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:XPath遍历输出XML所有叶子节点
举报原因:
原因补充:

(最多只允许输入30个字)