`

获取XML的XPATH - JAVA

    博客分类:
  • java
阅读更多

XmlErgodicTool.java实现了获取XML的XPATH,并且可以根据需要过滤属性的关键字。


List<String> attrFilter = new ArrayList<String>();


attrFilter.add("name");

 

 

1. XmlErgodicTool.java

 

import java.io.File;
import java.io.IOException;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.List;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

/**
 * 
 * 
 * 
 * <DL>
 * <DT><B> 递归遍历XML所有叶子节点的XPATH-JAVA </B></DT>
 * <p>
 * <DD>详细介绍</DD>
 * </DL>
 * <p>
 * 
 * <DL>
 * <DT><B>使用范例</B></DT>
 * <p>
 * <DD>使用范例说明</DD>
 * </DL>
 * <p>
 * 
 * @author 周典
 * @version
 * @Date: 2011-3-7 下午上午11:41:46
 */
public class XmlErgodicTool {

	/** XML编码 */
	private String encoding = "utf-8";

	/**
	 * @return the encoding
	 */
	public String getEncoding() {
		return encoding;
	}

	/**
	 * @param encoding
	 *            the encoding to set
	 */
	public void setEncoding(String encoding) {
		this.encoding = encoding;
	}

	/**
	 * 
	 * 
	 * <DL>
	 * <DT><B> 标题 </B></DT>
	 * <DD>详细介绍</DD>
	 * </DL>
	 * 
	 * 
	 */
	public XmlErgodicTool() {

	}

	/**
	 * 
	 * <DL>
	 * <DT><B> 从一个字符串中,获取XML叶子Bean的列表 </B></DT>
	 * <DD>详细介绍</DD>
	 * </DL>
	 * 
	 * @param xmlString
	 * @param attrFilter
	 * @return
	 * 
	 */
	public List<XmlLeafBean> getXmlLeafBeanList(String xmlString,
			List<String> attrFilter) {
		List<XmlLeafBean> xmlLeafBeanList = new ArrayList<XmlLeafBean>();
		Document document = null;
		try {
			// xmlString = new String(xmlString.getBytes(), encoding);
			StringReader stringReader = new StringReader(xmlString);
			InputSource inputSource = new InputSource(stringReader);
			DocumentBuilderFactory docBuilderFac = DocumentBuilderFactory
					.newInstance();
			DocumentBuilder docBuilder = docBuilderFac.newDocumentBuilder();
			document = docBuilder.parse(inputSource);
		} catch (ParserConfigurationException e) {
			e.printStackTrace();
		} catch (SAXException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		Node node = document.getDocumentElement();
		this.getElementList(node, xmlLeafBeanList, "", attrFilter);

		return xmlLeafBeanList;
	}

	/**
	 * 
	 * 
	 * <DL>
	 * <DT><B> 从一个文件获取XML叶子Bean的列表 </B></DT>
	 * <DD>详细介绍</DD>
	 * </DL>
	 * 
	 * @param xmlFile
	 * @param attrFilter
	 * @return
	 * 
	 */
	public List<XmlLeafBean> getXmlLeafBeanList(File xmlFile,
			List<String> attrFilter) {
		List<XmlLeafBean> xmlLeafBeanList = new ArrayList<XmlLeafBean>();
		DocumentBuilderFactory dBuilderFac = DocumentBuilderFactory
				.newInstance();
		DocumentBuilder dBuilder = null;
		Document document = null;
		try {
			dBuilder = dBuilderFac.newDocumentBuilder();
			document = dBuilder.parse(xmlFile);
		} catch (ParserConfigurationException e) {
			e.printStackTrace();
		} catch (SAXException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		Node node = document.getDocumentElement();
		this.getElementList(node, xmlLeafBeanList, "", attrFilter);
		this.createUniqueXmlLeafBeanList(xmlLeafBeanList, null, 0, 1);
		return xmlLeafBeanList;
	}

	/**
	 * 
	 * <DL>
	 * <DT><B> 递归遍历 Node取得XPath列表</B></DT>
	 * <DD>详细介绍</DD>
	 * </DL>
	 * 
	 * @param node
	 * @param xmlLeafBeanList
	 * @param currentNode
	 * @param filter
	 * 
	 */
	private void getElementList(Node node, List<XmlLeafBean> xmlLeafBeanList,
			String currentNode, List<String> filter) {
		if (node.getNodeType() == Node.ELEMENT_NODE) {
			currentNode = currentNode + "/" + node.getNodeName();
			NamedNodeMap namedNodeMap = node.getAttributes();
			String nodeAttr = "[ ";
			for (int i = 0; i < namedNodeMap.getLength(); i++) {
				Node attribute = namedNodeMap.item(i);
				if (filter == null || filter.size() == 0) {
					String nameAttr = " and @" + attribute.getNodeName() + "='"
							+ attribute.getNodeValue() + "'";
					nodeAttr += nameAttr;
				} else if (filter.contains(attribute.getNodeName())) {
					String nameAttr = " and @" + attribute.getNodeName() + "='"
							+ attribute.getNodeValue() + "'";
					nodeAttr += nameAttr;
				}
			}
			nodeAttr += " ]";
			if (namedNodeMap.getLength() > 0 && nodeAttr.length() > 4) {
				int indexAnd = nodeAttr.indexOf(" and ");
				nodeAttr = nodeAttr.substring(0, indexAnd)
						+ nodeAttr.substring(indexAnd + (" and ").length());
				currentNode += nodeAttr;
			}
			NodeList nodeList = node.getChildNodes();
			for (int i = 0; nodeList != null && i < nodeList.getLength(); i++) {
				this.getElementList(nodeList.item(i), xmlLeafBeanList,
						currentNode, filter);
			}
		} else if (node.getNodeType() == Node.TEXT_NODE) {
			if (!("").equals(node.getNodeValue().trim())) {
				String xpath = currentNode;
				String value = node.getNodeValue();
				xmlLeafBeanList.add(new XmlLeafBean(xpath, value));
			}
		}
	}

	/**
	 * 
	 * 
	 * <DL>
	 * <DT><B> 创建XPath唯一的XmlLeafBeanList </B></DT>
	 * <DD>详细介绍</DD>
	 * </DL>
	 * 
	 * @param xmlLeafBeanList
	 * @param preXmlLeafBean
	 * @param listIndex
	 * @param eleIndex
	 * 
	 */
	public void createUniqueXmlLeafBeanList(List<XmlLeafBean> xmlLeafBeanList,
			XmlLeafBean preXmlLeafBean, int listIndex, int eleIndex) {
		if (listIndex == xmlLeafBeanList.size()) {
			return;
		}
		XmlLeafBean currentXmlLeafBean = xmlLeafBeanList.get(listIndex);
		listIndex++;
		if (preXmlLeafBean != null) {
			String preXPath = preXmlLeafBean.getXpath();
			preXPath = preXPath.replaceAll("\\[\\d+\\]", "");
			if (preXPath.equals(currentXmlLeafBean.getXpath())) {
				preXmlLeafBean.setXpath(preXPath + "["
						+ eleIndex + "]");
				currentXmlLeafBean.setXpath(currentXmlLeafBean.getXpath() + "["
						+ (eleIndex + 1) + "]");
				eleIndex += 1;
			} else {
				eleIndex = 1;
			}
		}
		this.createUniqueXmlLeafBeanList(xmlLeafBeanList, currentXmlLeafBean,
				listIndex, eleIndex);
	}

	public static void main(String args[]) {
		List<String> attrFilter = new ArrayList<String>();
		attrFilter.add("name");

		String xmlString = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"
				+ "<doc>\n" + "    <person>\n" + "        <name>某人</name>\n"
				+ "        <adds>            \n"
				+ "            <add ID=\"10002\">\n"
				+ "                <BS>10002</BS>\n"
				+ "                <note>西安市太白路</note>\n"
				+ "            </add>\n" + "            <add ID=\"\">\n"
				+ "                <BS>10002</BS>\n"
				+ "                <note>空ID节点啊</note>\n"
				+ "            </add>\n" + "            <add>\n"
				+ "                <BS>10002</BS>\n"
				+ "                <note>空ID节点啊</note>\n"
				+ "            </add>\n" + "\t\t\t<add ID=\"10001\">\n"
				+ "\t\t\t\t<BS xmlns=\"10001\"/>\n"
				+ "                <note>西安市太白路2</note>\n"
				+ "            </add>\n" + "\t\t</adds>\n" + "    </person>\n"
				+ "    <other>\n" + "        <name ID=\"HEHE\">ASDF</name>\n"
				+ "    </other>\n" + "</doc>";
		XmlErgodicTool xmlErgodicTool1 = new XmlErgodicTool();
		List<XmlLeafBean> xmlLeafBeanList = xmlErgodicTool1.getXmlLeafBeanList(
				xmlString, attrFilter);
		for (XmlLeafBean xmlLeafBean : xmlLeafBeanList) {
			System.out.println(xmlLeafBean.getXpath() + " , "
					+ xmlLeafBean.getValue());
		}

		System.out.println("__________");

		XmlErgodicTool xmlErgodicTool2 = new XmlErgodicTool();
		List<XmlLeafBean> xmlLeafBeanList2 = xmlErgodicTool2
				.getXmlLeafBeanList(
						new File(
								"F:\\测试.xml"),
						attrFilter);
		for (XmlLeafBean xmlLeafBean : xmlLeafBeanList2) {
			System.out.println(xmlLeafBean.getXpath() + " , "
					+ xmlLeafBean.getValue());
		}
	}
}

 

2. XmlLeafBean.java

 

/**
 * 
 * <DL>
 * <DT><B> xml的叶子节点的Bean </B></DT>
 * <p>
 * <DD>详细介绍</DD>
 * <DD>这个Bean用来存放叶子节点的XPath 和 对应的Value</DD>
 * </DL>
 * <p>
 * 
 * <DL>
 * <DT><B>使用范例</B></DT>
 * <p>
 * <DD>使用范例说明</DD>
 * </DL>
 * <p>
 * 
 * @author 周典
 * @version
 * @Date: 2011-3-7 下午上午11:03:52
 * 
 */
public class XmlLeafBean {

	private String xpath;

	private String value;

	public XmlLeafBean() {

	}

	/**
	 * 
	 * <DL>
	 * <DT><B> 标题 </B></DT>
	 * <DD>详细介绍</DD>
	 * </DL>
	 * 
	 * @param xpath
	 * @param value
	 * 
	 */
	public XmlLeafBean(String xpath, String value) {
		this.xpath = xpath;
		this.value = value;
	}

	/**
	 * @return the xpath
	 */
	public String getXpath() {
		return xpath;
	}

	/**
	 * @param xpath
	 *            the xpath to set
	 */
	public void setXpath(String xpath) {
		this.xpath = xpath;
	}

	/**
	 * @return the value
	 */
	public String getValue() {
		return value;
	}

	/**
	 * @param value
	 *            the value to set
	 */
	public void setValue(String value) {
		this.value = value;
	}
}

 

3. 测试.xml

 

<?xml version="1.0" encoding="GB2312"?>
<service name="">
	<sys-header>
		<data name="SYS_HEAD">
			<struct>
				<data name="MESSAGE_TYPE">
					<field type="string" length="4" encrypt-mode="">1400</field>
					<field type="string" length="4" encrypt-mode="">1401</field>
					<field type="string" length="4" encrypt-mode="">1402</field>
					<field type="string" length="4" encrypt-mode="">1403</field>
					<field type="string" length="4" encrypt-mode="">1404</field>
					<field type="string" length="4" encrypt-mode="">1405</field>
				</data>
				<data name="MESSAGE_CODE">
					<field type="string" length="6" encrypt-mode="">9100</field>
					<field type="string" length="6" encrypt-mode="">9100</field>
				</data>
				<data name="SERVICE_CODE">
					<field type="string" length="8" encrypt-mode="">SVR_INQUIRY</field>
				</data>
			</struct>
		</data>
	</sys-header>
	<app-header>
		<data name="APP_HEAD">
			<struct>
				<data name="PGUP_OR_PGDN">
					<field type="string" length="1" encrypt-mode="">1</field>
				</data>
				<data name="TOTAL_NUM">
					<field type="string" length="10" encrypt-mode="">10</field>
				</data>
				<data name="CURRENT_NUM">
					<field type="string" length="10" encrypt-mode="">0</field>
				</data>
				<data name="PAGE_START">
					<field type="string" length="10" encrypt-mode="">0</field>
				</data>
				<data name="PAGE_END">
					<field type="string" length="10" encrypt-mode="">0</field>
				</data>
			</struct>
		</data>
	</app-header>
	<body>
		<data name="CLIENT_NO">
			<field type="string" length="12" encrypt-mode="">1234567890123</field>
		</data>
		<data name="GLOBAL_ID">
			<field type="string" length="25" encrypt-mode="">1234567890123456789012345</field>
		</data>
		<data name="GLOBAL_TYPE">
			<field type="string" length="3" encrypt-mode="">123</field>
		</data>
		<data name="ISS_COUNTRY">
			<field type="string" length="3" encrypt-mode="">我</field>
		</data>
	</body>
</service>

 

 

运行结果:

 

/doc/person/name , 某人
/doc/person/adds/add/BS , 10002
/doc/person/adds/add/note , 西安市太白路
/doc/person/adds/add/BS , 10002
/doc/person/adds/add/note , 空ID节点啊
/doc/person/adds/add/BS , 10002
/doc/person/adds/add/note , 空ID节点啊
/doc/person/adds/add/note , 西安市太白路2
/doc/other/name , ASDF
__________
/service[ @name='' ]/sys-header/data[ @name='SYS_HEAD' ]/struct/data[ @name='MESSAGE_TYPE' ]/field[1] , 1400
/service[ @name='' ]/sys-header/data[ @name='SYS_HEAD' ]/struct/data[ @name='MESSAGE_TYPE' ]/field[2] , 1401
/service[ @name='' ]/sys-header/data[ @name='SYS_HEAD' ]/struct/data[ @name='MESSAGE_TYPE' ]/field[3] , 1402
/service[ @name='' ]/sys-header/data[ @name='SYS_HEAD' ]/struct/data[ @name='MESSAGE_TYPE' ]/field[4] , 1403
/service[ @name='' ]/sys-header/data[ @name='SYS_HEAD' ]/struct/data[ @name='MESSAGE_TYPE' ]/field[5] , 1404
/service[ @name='' ]/sys-header/data[ @name='SYS_HEAD' ]/struct/data[ @name='MESSAGE_TYPE' ]/field[6] , 1405
/service[ @name='' ]/sys-header/data[ @name='SYS_HEAD' ]/struct/data[ @name='MESSAGE_CODE' ]/field[1] , 9100
/service[ @name='' ]/sys-header/data[ @name='SYS_HEAD' ]/struct/data[ @name='MESSAGE_CODE' ]/field[2] , 9100
/service[ @name='' ]/sys-header/data[ @name='SYS_HEAD' ]/struct/data[ @name='SERVICE_CODE' ]/field , SVR_INQUIRY
/service[ @name='' ]/app-header/data[ @name='APP_HEAD' ]/struct/data[ @name='PGUP_OR_PGDN' ]/field , 1
/service[ @name='' ]/app-header/data[ @name='APP_HEAD' ]/struct/data[ @name='TOTAL_NUM' ]/field , 10
/service[ @name='' ]/app-header/data[ @name='APP_HEAD' ]/struct/data[ @name='CURRENT_NUM' ]/field , 0
/service[ @name='' ]/app-header/data[ @name='APP_HEAD' ]/struct/data[ @name='PAGE_START' ]/field , 0
/service[ @name='' ]/app-header/data[ @name='APP_HEAD' ]/struct/data[ @name='PAGE_END' ]/field , 0
/service[ @name='' ]/body/data[ @name='CLIENT_NO' ]/field , 1234567890123
/service[ @name='' ]/body/data[ @name='GLOBAL_ID' ]/field , 1234567890123456789012345
/service[ @name='' ]/body/data[ @name='GLOBAL_TYPE' ]/field , 123
/service[ @name='' ]/body/data[ @name='ISS_COUNTRY' ]/field , 我

 

分享到:
评论

相关推荐

    Java中使用xpath获取xml中的数据

    使用xpath读取xml中的数据

    java xml xpath介绍

    java xml xpath介绍,XPath 使用路径表达式来选取 XML 文档中的节点或节点集。节点是通过沿着路径 (path) 或者步 (steps) 来选取的。

    xpath读取XML节点

    xpath读取XML节点 用jdom包

    Java and XML, 3rd Edition

    本书的前两章回顾有关XML的基础知识,包括XPath、XSL、DTD以及XML Schema,其余部分专注于讲述如何在Java程序内使用XML。《Java与XML》(第三版)的内容涵盖了所有主要的Java XML处理库程序,全面讲解了SAX、DOM...

    javaxml解析源码-XML-Parser:在Java中使用xPath解析xml文件源代码

    在Java中使用xPath解析xml文件源代码。 返回 基于数据节点xPath解析xml文件,并将xml文件数据返回到列表列表中。 键-列名。 值-列的数据。 如何使用 查找列的唯一路径,并使用它来获取该节点(列)的数据。

    java 的dom的读取xml

    XPath 是一门在 XML 文档中查找信息的语言。XPath 用于在 XML 文档中通过元素和属性进行导航。 在学习之前应该具备的知识: 在您继续学习之前,应该对下面的知识有基本的了解: • HTML / XHTML • XML / XML 命名...

    JAVA与XML.rar

    本书的前两章回顾有关XML的基础知识,包括XPath、XSL、DTD以及XML Schema,其余部分专注于讲述如何在Java程序内使用XML。《Java与XML》(第三版)的内容涵盖了所有主要的Java XML处理库程序,全面讲解了SAX、DOM、...

    DOM XPATH获取img src值的query

    您可能感兴趣的文章:c#通过xpath读取xml示例java使用xpath解析xml示例分享java使用xpath和dom4j解析xml深入XPath的详解以及Java示例代码分析解析XPath语法之在C#中使用XPath的示例详解使用HtmlAgilityPack XPath ...

    Java通过XPath获取XML文件中符合特定条件的节点

    今天小编就为大家分享一篇关于Java通过XPath获取XML文件中符合特定条件的节点,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

    fluentxml4j:Java中用于XML解析,序列化,XPath查询和转换的fluent API

    FluentXML4J-Java中XML的流畅API XML解析,序列化XPath查询和转换,无需样板代码 ...通过XPath查询org.w3c.dom.Document以获取String,Boolean,Number,org.w3c.dom.Element或Node,并使用Java 8 Streaming API

    XpathDemo.zip

    JsoupXPath的节点对象JXNode不仅可以获取标签节点,还可以获取属性节点 HtmlCleaner是一个开源的Java语言的Html文档解析器。HtmlCleaner能够重新整理HTML文档的每个元素并生成结构良好(Well-Formed)的 HTML 文档。...

    Java中读取XML 文件的知识点

    xml 解析 dom 文档对象模型(随机访问) 效率慢 受大小限制(10M) ...解开后有两个包,仅操作XML文档的话把dom4j-1.6.1.jar加入工程就可以了,如果需要使用XPath的话还需要加入包jaxen-1.1-beta-7.jar.

    JAVA_API1.6文档(中文)

    JAVA开发人员必备是HTML格式的 JavaTM 2 Platform Standard Edition 6 API 规范 本文档是 Java 2 Platform Standard Edition 6.0 的 API 规范。...javax.xml.xpath 此包提供了用于 XPath 表达式的计算和访问计算...

    xpath 生成excel

    包中包括两个示例 1:使用xpath读取xml文件中的数据,写入到excel模板中生成excel文档 2:使用java代码结合xpath语法读取xml文件中的数据

    XML轻松学习手册--XML肯定是未来的发展趋势,不论是网页设计师还是网络程序员,都应该及时学习和了解

    XML越来越热,关于XML的基础教程网络上也随处可见。可是一大堆的概念和术语往往让人望而生畏,很多朋友问我:XML到底有什么用,我们是否需要学习它?我想就我个人学习过程的心得和经验,写一篇比较全面的介绍文章。...

    XPath 教程(XPath Tutorial)多国语言帮助手册.rar

    XPath 教程(XPath Tutorial)多国语言.里面可以选择语言,选择之后就可以看了。XPATH解析xml真的很快

    jdom1.1.3xml解析工具类

    org.jdom包含了所有的xml文档要素的java类 org.jdom.adapters包含了与dom适配的java类 org.jdom.filter包含了xml文档的过滤器类 org.jdom.input包含了读取xml文档的类 org.jdom.output包含了写入xml文档的类 org....

    JDOM(java)使用详解及实例

    org.jdom.input 包含了读取xml文档的类 org.jdom.output 包含了写入xml文档的类 org.jdom.transform 包含了将jdom xml文档接口转换为其他xml文档接口 org.jdom.xpath 包含了对xml文档xpath操作的类三、...

    Java 1.6 API 中文 New

    javax.xml.xpath 此包提供了用于 XPath 表达式的计算和访问计算环境的 object-model neutral API。 org.ietf.jgss 此包提供一个框架,该框架允许应用程序开发人员通过利用统一的 API 使用一些来自各种基础安全机制...

    疯狂XML讲义 源码

    第二部分介绍了CSS、XSLT和XPath等知识,通过使用CSS或XSLT,可直接将XML文档当成视图技术。第三部分介绍了DOM、SAX、JAXP、dom4j、JDOM、XQuery和XQJ等,其中的DOM、SAX、JAXP、dom4i和JDOM都以结构化的方式来创建...

Global site tag (gtag.js) - Google Analytics