- 浏览: 89946 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
di1984HIT:
学习了。。。
groovy.lang.MissingPropertyException: No such property: Sql for class异常 -
SE_XiaoFeng:
竟然没有写完,我哩个去,博主,写完它,加油.
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 , 我
发表评论
-
Element type xx must be followed by either attribute specifications, “>” or “/>”
2011-12-15 19:39 7918第一种可能性: Element type xx mus ... -
使用xpath获取xml指定节点或节点集工具类
2011-03-10 22:58 2576使用xpath获取xml指定节点的属性 1. ... -
纯Java(swing)写的xsd验证xml - 含源码
2010-11-19 15:48 1169纯Java(swing)写的xsd验证xml - 含源码 ... -
Java对象序列化和反序列化工具类
2010-10-26 11:45 2276package com.eadi.util;import ja ... -
xsd验证xml - 含源码
2010-06-30 19:55 2007xsd验证xml - 含源码 关键代码: ...
相关推荐
XPath,全称XML Path Language,是一种在XML文档中查找信息的语言。它被设计用来选取XML文档中的节点,如元素、属性、文本等。...在Java框架中,无论是简单的XML读取还是复杂的XML操作,XPath都是一个非常实用的工具。
JsoupXpath-0.3.2.jar 是一个Java库,它扩展了Jsoup库的功能,引入了XPath支持。Jsoup是一个流行的Java库,用于处理和解析HTML文档,提供了类似于jQuery的API,使得在Java中操作HTML变得简单易行。然而,原生的Jsoup...
下面是一段简单的示例代码,展示了如何在Java中使用XPath获取XML数据: ```java import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.DocumentBuilder; import org.w3c.dom.Document; ...
Java XML XPath 是一种在XML文档中查找信息的语言,它被广泛用于Java开发中,以便高效地提取和操作XML数据。XPath使用路径表达式来选取XML文档中的节点或节点集,这些表达式类似于文件系统的路径,但针对的是XML文档...
XPath-Solve.rar 是一个压缩包,包含了多个与XPath和XML处理相关的资源,特别是针对Java环境下的应用。XPath是一种在XML文档中查找信息的语言,而Java是广泛使用的编程语言,经常用于处理XML数据。这个压缩包可能是...
了解并熟练使用这些API,对于Java开发者来说至关重要,因为它们可以帮助我们有效地读取、写入、验证和处理XML数据。在处理XML问题时,熟悉这些基本概念和API可以帮助快速定位和解决问题,提高开发效率。
在Java XML处理中,JsoupXpath常用于需要更复杂查询或与现有XPath兼容的项目。例如,如果你有一个XML文档,需要根据特定条件筛选节点,XPath可以提供更直观且强大的方法。 在标签"jspatch"的上下文中,这可能暗示...
在Java编程中,JDOM库是一个流行的解析和操作XML的工具,它提供了对XPath的支持,使得我们可以方便地通过XPath表达式来读取XML文档的节点。 首先,理解XPath的基本语法是非常重要的。XPath表达式由路径表达式组成,...
4. **XML修改**:VTD-XML不仅支持XML的读取,还支持XML的修改。通过`XMLModifier`接口,可以插入、删除或替换XML元素和属性,同时保持XML文档的结构完整性和一致性。 5. **性能优势**:与DOM和SAX解析器相比,VTD-...
DOM解析器将整个XML文档加载到内存中的树形结构,方便随机访问,而SAX解析器则采用事件驱动的方式,逐行读取XML,适用于大文件或内存有限的情况。 2. **DOM解析**:通过`javax.xml.parsers.DocumentBuilderFactory`...
接着,`<x:path>`标签可以用来执行XPath表达式,获取XML文档中的特定节点或数据。 例如,以下是一个简单的JSP页面示例,展示了如何使用JSTL的XML和XPath功能: ```jsp <%@ taglib prefix="c" uri="http://java.sun...
2. **SAX解析**:SAX是一种事件驱动的解析方式,它逐行读取XML文档,遇到元素、属性等时触发相应的事件处理器。这种方式节省内存,适合处理大型XML文件。"sax_xml sax_解析_xml"标签表明了本压缩包包含使用SAX解析...
XPathFactory 用于创建 XPath 对象,XPath 对象可以编译 XPath 表达式为 XPathExpression,然后执行该表达式来获取 XML 文档中的节点集或单一值。然而,实际应用中,这个过程可能比较繁琐,XPath 提供者插件就是为了...
通过XPath表达式,可以轻松地选取和操作XML中的特定元素,例如`SelectSingleNode("//title")`用于获取名为"title"的元素,并通过`InnerText`属性获取其文本内容。 总结,这个过程展示了如何使用Ajax将XML数据发送到...
在Java中,我们可以使用`javax.xml.xpath`包中的类来执行XPath表达式。 4. **XSLT(可扩展样式表语言转换)**:用于将XML文档转换成其他形式,如HTML或另一个XML文档。Java提供了`javax.xml.transform`包来支持XSLT...
因此,Xerces-Java还提供了SAX解析器,它以事件驱动的方式处理XML文档,只在需要时读取数据,从而节省内存。SAX解析适合处理大文件或流式处理场景,但它的编程模型相对复杂,因为开发者需要实现事件处理器接口来响应...
虽然不在"xml-apis.jar"内,但Java通过`javax.xml.xpath`和`javax.xml.transform`包提供了对它们的支持。 总的来说,"xml-apis.zip" 提供的API对于任何涉及XML处理的Java项目都是必不可少的。无论是简单的XML读写,...
本文将详细介绍如何使用Java来读取和修改XML文件,主要涉及以下几个核心知识点: 1. **DOM解析器**: Document Object Model(DOM)是一种将XML文档转换为内存中的树形结构的方法,使得可以遍历和修改XML文件。...
在实际应用中,XML-repair工具类通常集成到XML解析或处理流程中,如在读取XML文件之前先进行修复,或者在接收到XML数据后立即进行处理。这样可以确保后续的操作,如XML解析、DOM构建、XPath查询等,都能顺利进行。 ...
Java程序可能会读取XML文件,解析出球员信息,如姓名、位置、得分等,并进行展示、统计或分析。例如,可以创建一个`Player`类,使用JAXB将XML数据绑定到Java对象,再进行业务逻辑处理。此外,可能还会涉及到XML的...