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定位,获取某个子节点中的某个孩子节点或者文本

一直没空写,今天又碰到了之前的坑,拿出来记录一下, 关于如何获取一个节点中的某个子节点或文本值 直接上Demo,下面是HTML案例, Python工程师 15K-25K 北京 ...
  • wympqlamz15422
  • wympqlamz15422
  • 2017-12-19 17:01:36
  • 458

xpath选择当前结点的子节点

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

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

XPath 是一门在 XML 文档中查找信息的语言。XPath 可用来在 XML 文档中对元素和属性进行遍历。 XPath 是 W3C XSLT 标准的主要元素,并且 XQuery 和 XPoint...
  • u012895467
  • u012895467
  • 2013-11-29 13:25:05
  • 3407

xpath获取子孙元素

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

xpath的使用

首先下载lxml.   pip install lxml >>> def getxpath(html): #返回html的xml结构     return etree.HTML...
  • qq_34941745
  • qq_34941745
  • 2017-03-26 13:40:47
  • 3431

Js根据xpath获取元素

function _x(STR_XPATH) { var xresult = document.evaluate(STR_XPATH, document, null, XPathResult....
  • u010085423
  • u010085423
  • 2017-01-19 18:54:04
  • 2452

初学xpath 解决如何获取子孙节点的文本内容

摘要:text()和string()的区别情景:今天刚学习xpath,想扒百度搜索内容,碰到难点,想获得子节点下所有的文本内容,终于碰到一篇有用的文章,特此记录区别:text() 只获得当前节点的文本...
  • cwb9551
  • cwb9551
  • 2017-11-06 23:45:16
  • 1044

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

xpath_input_exp_mark = '//label[contains(text(), "文本内容")]/../following-sibling::div[1]//input'browse...
  • HeatDeath
  • HeatDeath
  • 2017-05-16 10:44:33
  • 11244

python使用lxml解析html获取页面内所有叶子节点的xpath路径

因为需要使用叶子节点的路径来作为特征,但是原始的lxml模块解析之后得到的却是整个页面中所有节点的xpath路径,不是我们真正想要的形式,所以就要进行相关的处理才行了,差了很多网上的博客和文档也没有找...
  • Together_CZ
  • Together_CZ
  • 2017-06-30 22:53:38
  • 1334

php 使用 domxpath读写元素

php本身自带了,DomXpath,可以方便提取网页中的元素内容. 为了方便操作还需要启用tidy扩展包, windows系统在php.ini 中的extensions=php_tidy.dll行去掉...
  • robinhunan
  • robinhunan
  • 2017-06-28 10:06:38
  • 1264
收藏助手
不良信息举报
您举报文章:XPath遍历输出XML所有叶子节点
举报原因:
原因补充:

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