- 浏览: 90253 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
di1984HIT:
学习了。。。
groovy.lang.MissingPropertyException: No such property: Sql for class异常 -
SE_XiaoFeng:
竟然没有写完,我哩个去,博主,写完它,加油.
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>
发表评论
-
Element type xx must be followed by either attribute specifications, “>” or “/>”
2011-12-15 19:39 7937第一种可能性: Element type xx mus ... -
获取XML的XPATH - JAVA
2011-03-08 09:22 4638XmlErgodicTool.java实现了获取XML的XPA ... -
纯Java(swing)写的xsd验证xml - 含源码
2010-11-19 15:48 1185纯Java(swing)写的xsd验证xml - 含源码 ... -
Java对象序列化和反序列化工具类
2010-10-26 11:45 2284package com.eadi.util;import ja ... -
xsd验证xml - 含源码
2010-06-30 19:55 2015xsd验证xml - 含源码 关键代码: ...
相关推荐
在Java编程中,JDOM库是一个流行的解析和操作XML的工具,它提供了对XPath的支持,使得我们可以方便地通过XPath表达式来读取XML文档的节点。 首先,理解XPath的基本语法是非常重要的。XPath表达式由路径表达式组成,...
记住,XPath是XML处理中的强大工具,合理使用能大大提高开发效率。在处理大型XML文档时,使用XPath配合Java进行数据提取,可以避免遍历整个DOM结构,从而提高性能。 总结,Java中使用XPath获取XML数据涉及的关键...
在本教程中,我们将深入探讨如何使用DOM4J解析(读取)XML节点数据,不受XML层级的限制。 首先,确保你已经下载了必要的依赖,即DOM4J库。通常,这将是一个名为`dom4j-x.x.x.jar`的文件,其中x.x.x是DOM4J的版本号...
XPath是XML文档遍历和数据提取的重要工具,它允许我们以简洁的方式定位XML文档中的元素、属性和其他节点。在这个场景中,“Xpath读取xml文件,实现文件缓存”指的是利用XPath来高效地检索XML数据,并通过缓存机制...
本文将深入探讨如何使用DOM和XPath来读取XML数据,并将其有效导入到Oracle数据库中。 首先,DOM是一种将XML文档结构化为树形模型的API,它允许开发者通过节点操作来访问和修改XML文档的任何部分。在Java中,我们...
例如,我们可以使用`javax.xml.xpath`包提供的`XPathFactory`、`XPath`和`XPathConstants`类来实现这一过程。 4. **避免生成过多的Bean类** 当XML结构复杂时,通常会为每个元素创建对应的Java Bean类。然而,使用...
在这里,我们将主要关注如何使用XmlDocument类来读取指定的XML节点。 1. 加载XML文件: 使用XmlDocument类的Load方法可以加载XML文件到内存中。例如: ```csharp XmlDocument xmlDoc = new XmlDocument(); ...
"XML通用解析工具类"通常会提供一套接口或方法,封装了上述解析方式,以简化开发者的代码编写。这类工具可能包括以下功能: 1. 解析XML文件:提供方法读取XML文件并将其解析为易于操作的数据结构。 2. 创建XML:...
C#中,可以利用`XmlNode.SelectSingleNode()`方法找到指定的XPath路径,或者`XmlNode.SelectNodes()`方法获取所有匹配的节点。 3. **XPath表达式构建**:在获取到用户选择的元素后,小工具需要根据DOM结构自动生成...
XPath是XML文档遍历和查询的强大工具,它允许开发者通过路径表达式来选取XML文档中的节点。在处理具有命名空间的XML文档时,XPath的使用会变得稍微复杂,因为命名空间为元素和属性提供了唯一的标识,防止了名称冲突...
在处理大型或复杂XML文档时,还可以考虑使用SAX(Simple API for XML)解析器,它以事件驱动的方式读取XML,减少了内存占用。但C#中默认的XmlTextReader并不完全符合SAX规范,所以需要借助第三方库,如SharpDevelop...
本篇文章将详细讲解如何使用VB来操纵XML文档,特别是读取其中的节点信息。 首先,我们需要引入XML相关的命名空间,这可以通过在VB代码的开头添加以下语句来实现: ```vb Imports System.Xml ``` 接下来,我们将...
2. **XmlDocument类**:这个类用于加载XML文件,并提供遍历XML节点的方法。例如,使用Load()方法加载XML文件,然后通过SelectNodes()或SelectSingleNode()方法查询特定节点。 3. **XPath查询**:XPath是一种在XML...
例如,使用JAXB和XPath获取`text`节点的值: ```java DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); Document doc = ...
在实际应用中,这样的工具类可能会包含更多的功能,比如创建、修改或删除XML节点,以及使用XPath表达式进行快速定位。XPath是一种在XML文档中查找信息的语言,它允许我们通过路径表达式来选取节点,大大提高了查询...
2. **加载XML** - 使用`pugi::xml_document`类加载XML文件或字符串。 3. **解析XML** - 利用`pugi::xml_node`接口遍历和操作XML结构。 4. **XPath查询** - 通过`pugi::xpath_query`和`pugi::xpath_node_set`执行...
例如,下面的`GetXmlNodeInfo`方法可以获取一个XML节点的文本内容: ```csharp public static string GetXmlNodeInfo(XmlNode node, string type = "xml") { if (node == null) return string.Empty; if (type ...
XPath(XML Path Language)则是用于在XML文档中查找信息的语言,它允许我们通过路径表达式来选取XML节点,如元素、属性、文本等。 在Java开发中,处理XML和XPath通常需要引入特定的库。在提供的信息中,有两个关键...
2. 遍历XML结构:读取XML文件后,可以使用XPath或LINQ to XML来查询和遍历XML树。XPath是用于在XML文档中查找信息的标准语言,而LINQ to XML是.NET框架的一部分,提供了更面向对象的方式来操作XML。 3. 提取数据:...
2. **解析XML文档**:使用Dom4J的`DocumentHelper`类,我们可以加载XML文件并创建一个`Document`对象,如下: ```java String xmlString = "<root><element attr='value'>Text</element></root>"; Document ...