`

使用xpath获取xml指定节点或节点集工具类

    博客分类:
  • java
阅读更多

使用xpath获取xml指定节点的属性

 

 

1. XmlXPathUtil.java

 

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.StringReader;
import java.io.UnsupportedEncodingException;
import java.util.Iterator;
import java.util.Map;

import javax.xml.XMLConstants;
import javax.xml.namespace.NamespaceContext;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;

/**
 * 
 * 
 * <DL>
 * <DT><B> 使用路径表达式(XPath)来获取XML文档中的节点或节点集工具类 </B></DT>
 * <p>
 * <DD>详细介绍</DD>
 * </DL>
 * <p>
 * 
 * <DL>
 * <DT><B>使用范例</B></DT>
 * <p>
 * <DD>使用范例说明</DD>
 * </DL>
 * <p>
 * 
 * @author 周典
 * @version
 */

public class XmlXPathUtil {

	private static final Log logger = LogFactory.getLog(XmlXPathUtil.class);

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

	private NamespaceContext defaultNamespaceContext;

	public XmlXPathUtil() {
		defaultNamespaceContext = new NamespaceContext() {
			private Map<String, String> m_prefixMap = null;

			public String getNamespaceURI(String prefix) {
				if (null == prefix) {
					throw new NullPointerException("Null prefix");
				} else {
					if ("xml".equals(prefix)) {
						return XMLConstants.XML_NS_URI;
					}
					if (null != m_prefixMap) {
						for (String key : m_prefixMap.keySet()) {
							if (key.equals(prefix)) {
								return m_prefixMap.get(key);
							}
						}
					}
				}
				return XMLConstants.NULL_NS_URI;
			}

			public String getPrefix(String uri) {
				throw new UnsupportedOperationException();
			}

			public Iterator getPrefixes(String uri) {
				throw new UnsupportedOperationException();
			}
		};
	}

	/**
	 * 
	 * 获取XPath的值
	 * 
	 * @param query
	 * 
	 * @param xmlDocument
	 * 
	 * @param defaultNamespaceContext
	 * 
	 * @return String
	 */
	public String evaluateXPath(String query, Node xmlDocument,
			NamespaceContext defaultNamespaceContext) {
		String result = null;
		XPathFactory factory = XPathFactory.newInstance();
		XPath xpath = factory.newXPath();
		if (defaultNamespaceContext == null) {
			defaultNamespaceContext = this.defaultNamespaceContext;
		}
		xpath.setNamespaceContext(defaultNamespaceContext);
		XPathExpression expr = null;
		try {
			expr = xpath.compile(query);
		} catch (XPathExpressionException xpee) {
			Throwable x = xpee;
			if (null != xpee.getCause()) {
				x = xpee.getCause();
				if ("javax.xml.transform.TransformerException".equals(x
						.getClass().getName())) {
					if (logger.isDebugEnabled()) {
						logger.debug("xpath表达式错误:所有的命名空间需要转换。");
					}
				} else {
					if (logger.isDebugEnabled()) {
						logger.debug("xpath表达式错误:可能表达式格式有误。");
					}
				}
			}
			return null;
		}
		try {
			result = (String) expr.evaluate(xmlDocument, XPathConstants.STRING);
		} catch (XPathExpressionException e) {
			e.printStackTrace();
		}
		return result;
	}

	/**
	 * 加载XML String资源
	 * 
	 * @param xmlString
	 *            xml格式的字符串
	 * @return Node
	 * 
	 */
	public Node loadXMLResource(String xmlString) {
		if (0xFEFF == xmlString.charAt(0)) {
			xmlString = xmlString.substring(1);
		}
		InputSource source = new InputSource(new BufferedReader(
				new StringReader(xmlString)));
		return this.xmlSourceToDocument(source);
	}

	/**
	 * 加载XML byte[]资源
	 * 
	 * @param xmlFile
	 *            xml文件
	 * @return Node
	 * 
	 */
	public Node loadXMLResource(byte xmlByte[]) {
		String xmlString = "";
		try {
			xmlString = new String(xmlByte, encoding);
		} catch (UnsupportedEncodingException e) {
			if (logger.isDebugEnabled()) {
				logger.debug(e.getMessage());
			}
		}
		if (0xFEFF == xmlString.charAt(0)) {
			xmlString = xmlString.substring(1);
		}
		InputSource source = new InputSource(new BufferedReader(
				new StringReader(xmlString)));
		return this.xmlSourceToDocument(source);
	}

	/**
	 * 加载XML File资源
	 * 
	 * @param xmlFile
	 *            xml文件
	 * @return Node
	 * 
	 */
	public Node loadXMLResource(File xmlFile) {
		InputSource source = null;
		try {
			source = new InputSource(new FileInputStream(xmlFile));
		} catch (FileNotFoundException e) {
			if (logger.isDebugEnabled()) {
				logger.debug(e.getMessage());
			}
		}
		return this.xmlSourceToDocument(source);
	}

	/**
	 * 
	 * 把xml source 转换为Document
	 * 
	 * @param source
	 * 
	 * @return
	 * 
	 */
	private Node xmlSourceToDocument(InputSource source) {
		source.setEncoding(encoding);
		Document document = null;
		try {
			document = loadDocument(source);
		} catch (SAXParseException spe) {
			if (null != spe.getSystemId()) {
				if (logger.isDebugEnabled()) {
					logger.debug("xpath解析错误,出错的行数是:" + spe.getLineNumber()
							+ ",uri:" + spe.getSystemId());
					logger.debug(spe.getMessage());
				}
			} else {
				if (logger.isDebugEnabled()) {
					logger.debug(spe.getMessage());
				}
			}
			Exception x = spe;
			if (null != spe.getException()) {
				x = spe.getException();
			}
		} catch (SAXException se) {
			document = null;
			if (logger.isDebugEnabled()) {
				logger.debug("解析XML错误,请确保存在格式正确的XML文档。");
			}
			Exception x = se;
			if (null != se.getException()) {
				x = se.getException();
			}
		} catch (IOException ioe) {
			document = null;
			if (logger.isDebugEnabled()) {
				logger.debug("不能加载文档,文档不可读取。");
			}
		}
		return document;
	}

	/**
	 * 
	 * 从InputSource加载document
	 * 
	 * @param source
	 * @return Node
	 * @throws SAXException
	 * @throws IOException
	 */
	private Document loadDocument(InputSource source) throws SAXException,
			IOException {
		Document document = null;
		DocumentBuilder parser = null;
		DocumentBuilderFactory domFactory = DocumentBuilderFactory
				.newInstance();
		domFactory.setNamespaceAware(true);
		domFactory.setValidating(false);
		try {
			parser = domFactory.newDocumentBuilder();
		} catch (ParserConfigurationException pce) {
			if (logger.isDebugEnabled()) {
				logger.debug(pce.getMessage());
			}
		}
		parser.reset();
		document = parser.parse(source);
		return document;
	}

	/**
	 * 
	 * 设置xml编码
	 * 
	 * @param encoding
	 */
	public void setEncoding(String encoding) {
		this.encoding = encoding;
	}

	/**
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		String xmlString = "<?xml version=\"1.0\" encoding=\"utf-8\"?>";
		xmlString += "<books>";
		xmlString += "<book><name>Action1</name></book>";
		xmlString += "<book><name first='asdf'>Action2</name></book>";
		xmlString += "</books>";
		XmlXPathUtil xmlXPathUtil = new XmlXPathUtil();
		xmlXPathUtil.setEncoding("utf-8");
		Node fileNode = xmlXPathUtil
				.loadXMLResource(new File(
						"F:\\客户信息查询.xml"));
		Node strNode = xmlXPathUtil.loadXMLResource(xmlString);
		String strValue = xmlXPathUtil.evaluateXPath("//book", strNode, null);
		String fileValue = xmlXPathUtil
				.evaluateXPath(
						"/service[ @name='' ]/sys-header/data[ @name='SYS_HEAD' ]/struct/data[ @name='MESSAGE_TYPE' ]/field[1]/text()",
						fileNode, null);
		System.out.println("execute result: " + strValue);
		System.out.println("execute result: " + fileValue);
	}
}


2. 客户信息查询.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>
				</data>
				<data name="MESSAGE_CODE">
					<field type="string" length="6" encrypt-mode="">9100</field>
				</data>
				<data name="SERVICE_CODE">
					<field type="string" length="8" encrypt-mode="">SVR_INQUIRY1</field>
					<field type="string" length="8" encrypt-mode="">SVR_INQUIRY2</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="">123</field>
		</data>
	</body>
</service>

 

 

 

 

 

分享到:
评论

相关推荐

    xpath读取XML节点

    在Java编程中,JDOM库是一个流行的解析和操作XML的工具,它提供了对XPath的支持,使得我们可以方便地通过XPath表达式来读取XML文档的节点。 首先,理解XPath的基本语法是非常重要的。XPath表达式由路径表达式组成,...

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

    记住,XPath是XML处理中的强大工具,合理使用能大大提高开发效率。在处理大型XML文档时,使用XPath配合Java进行数据提取,可以避免遍历整个DOM结构,从而提高性能。 总结,Java中使用XPath获取XML数据涉及的关键...

    dom4j 解析(读取) xml 节点数据

    在本教程中,我们将深入探讨如何使用DOM4J解析(读取)XML节点数据,不受XML层级的限制。 首先,确保你已经下载了必要的依赖,即DOM4J库。通常,这将是一个名为`dom4j-x.x.x.jar`的文件,其中x.x.x是DOM4J的版本号...

    Xpath读取xml文件,实现文件缓存。

    XPath是XML文档遍历和数据提取的重要工具,它允许我们以简洁的方式定位XML文档中的元素、属性和其他节点。在这个场景中,“Xpath读取xml文件,实现文件缓存”指的是利用XPath来高效地检索XML数据,并通过缓存机制...

    dom+xpath读取xml并导入oracle.rar

    本文将深入探讨如何使用DOM和XPath来读取XML数据,并将其有效导入到Oracle数据库中。 首先,DOM是一种将XML文档结构化为树形模型的API,它允许开发者通过节点操作来访问和修改XML文档的任何部分。在Java中,我们...

    xpath解析xml

    例如,我们可以使用`javax.xml.xpath`包提供的`XPathFactory`、`XPath`和`XPathConstants`类来实现这一过程。 4. **避免生成过多的Bean类** 当XML结构复杂时,通常会为每个元素创建对应的Java Bean类。然而,使用...

    C#读取指定XML节点.zip

    在这里,我们将主要关注如何使用XmlDocument类来读取指定的XML节点。 1. 加载XML文件: 使用XmlDocument类的Load方法可以加载XML文件到内存中。例如: ```csharp XmlDocument xmlDoc = new XmlDocument(); ...

    XML通用解析工具类

    "XML通用解析工具类"通常会提供一套接口或方法,封装了上述解析方式,以简化开发者的代码编写。这类工具可能包括以下功能: 1. 解析XML文件:提供方法读取XML文件并将其解析为易于操作的数据结构。 2. 创建XML:...

    IE下获取XPATH小工具源码_xpath_

    C#中,可以利用`XmlNode.SelectSingleNode()`方法找到指定的XPath路径,或者`XmlNode.SelectNodes()`方法获取所有匹配的节点。 3. **XPath表达式构建**:在获取到用户选择的元素后,小工具需要根据DOM结构自动生成...

    XPATH读取有命名空间的节点

    XPath是XML文档遍历和查询的强大工具,它允许开发者通过路径表达式来选取XML文档中的节点。在处理具有命名空间的XML文档时,XPath的使用会变得稍微复杂,因为命名空间为元素和属性提供了唯一的标识,防止了名称冲突...

    Q694896 问答问题的回答 C#遍历XML文件节点内容

    在处理大型或复杂XML文档时,还可以考虑使用SAX(Simple API for XML)解析器,它以事件驱动的方式读取XML,减少了内存占用。但C#中默认的XmlTextReader并不完全符合SAX规范,所以需要借助第三方库,如SharpDevelop...

    VB操纵XML文档读取节点

    本篇文章将详细讲解如何使用VB来操纵XML文档,特别是读取其中的节点信息。 首先,我们需要引入XML相关的命名空间,这可以通过在VB代码的开头添加以下语句来实现: ```vb Imports System.Xml ``` 接下来,我们将...

    用C#快速读取XML文件,并遍历

    2. **XmlDocument类**:这个类用于加载XML文件,并提供遍历XML节点的方法。例如,使用Load()方法加载XML文件,然后通过SelectNodes()或SelectSingleNode()方法查询特定节点。 3. **XPath查询**:XPath是一种在XML...

    JAVA JAXB 解析XML嵌套子节点为字符串

    例如,使用JAXB和XPath获取`text`节点的值: ```java DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); Document doc = ...

    xml-dom4j解析工具类

    在实际应用中,这样的工具类可能会包含更多的功能,比如创建、修改或删除XML节点,以及使用XPath表达式进行快速定位。XPath是一种在XML文档中查找信息的语言,它允许我们通过路径表达式来选取节点,大大提高了查询...

    支持xpath的高效xml解析库源代码

    2. **加载XML** - 使用`pugi::xml_document`类加载XML文件或字符串。 3. **解析XML** - 利用`pugi::xml_node`接口遍历和操作XML结构。 4. **XPath查询** - 通过`pugi::xpath_query`和`pugi::xpath_node_set`执行...

    c#通过xpath读取xml示例

    例如,下面的`GetXmlNodeInfo`方法可以获取一个XML节点的文本内容: ```csharp public static string GetXmlNodeInfo(XmlNode node, string type = "xml") { if (node == null) return string.Empty; if (type ...

    使用xml与xpath是需要引用的.jar

    XPath(XML Path Language)则是用于在XML文档中查找信息的语言,它允许我们通过路径表达式来选取XML节点,如元素、属性、文本等。 在Java开发中,处理XML和XPath通常需要引入特定的库。在提供的信息中,有两个关键...

    Unity创建或读取xml脚本

    2. 遍历XML结构:读取XML文件后,可以使用XPath或LINQ to XML来查询和遍历XML树。XPath是用于在XML文档中查找信息的标准语言,而LINQ to XML是.NET框架的一部分,提供了更面向对象的方式来操作XML。 3. 提取数据:...

    Dom4J采用XPath操纵XML教程及例子

    2. **解析XML文档**:使用Dom4J的`DocumentHelper`类,我们可以加载XML文件并创建一个`Document`对象,如下: ```java String xmlString = "&lt;root&gt;&lt;element attr='value'&gt;Text&lt;/element&gt;&lt;/root&gt;"; Document ...

Global site tag (gtag.js) - Google Analytics