`

获取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 , 我

 

分享到:
评论

相关推荐

    xpath--java框架技术

    XPath,全称XML Path Language,是一种在XML文档中查找信息的语言。它被设计用来选取XML文档中的节点,如元素、属性、文本等。...在Java框架中,无论是简单的XML读取还是复杂的XML操作,XPath都是一个非常实用的工具。

    JsoupXpath-0.3.2.jar.rar

    JsoupXpath-0.3.2.jar 是一个Java库,它扩展了Jsoup库的功能,引入了XPath支持。Jsoup是一个流行的Java库,用于处理和解析HTML文档,提供了类似于jQuery的API,使得在Java中操作HTML变得简单易行。然而,原生的Jsoup...

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

    下面是一段简单的示例代码,展示了如何在Java中使用XPath获取XML数据: ```java import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.DocumentBuilder; import org.w3c.dom.Document; ...

    java xml xpath介绍

    Java XML XPath 是一种在XML文档中查找信息的语言,它被广泛用于Java开发中,以便高效地提取和操作XML数据。XPath使用路径表达式来选取XML文档中的节点或节点集,这些表达式类似于文件系统的路径,但针对的是XML文档...

    XPath-Solve.rar

    XPath-Solve.rar 是一个压缩包,包含了多个与XPath和XML处理相关的资源,特别是针对Java环境下的应用。XPath是一种在XML文档中查找信息的语言,而Java是广泛使用的编程语言,经常用于处理XML数据。这个压缩包可能是...

    xml-apis-1.4.01.jar.zip

    了解并熟练使用这些API,对于Java开发者来说至关重要,因为它们可以帮助我们有效地读取、写入、验证和处理XML数据。在处理XML问题时,熟悉这些基本概念和API可以帮助快速定位和解决问题,提高开发效率。

    jsoup-1.11.2.jar JsoupXpath-0.3.2

    在Java XML处理中,JsoupXpath常用于需要更复杂查询或与现有XPath兼容的项目。例如,如果你有一个XML文档,需要根据特定条件筛选节点,XPath可以提供更直观且强大的方法。 在标签"jspatch"的上下文中,这可能暗示...

    xpath读取XML节点

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

    vtd-xml vtd-xml vtd-xml

    4. **XML修改**:VTD-XML不仅支持XML的读取,还支持XML的修改。通过`XMLModifier`接口,可以插入、删除或替换XML元素和属性,同时保持XML文档的结构完整性和一致性。 5. **性能优势**:与DOM和SAX解析器相比,VTD-...

    XML How to Program-Java.zip_XML java_java how to program_java xm

    DOM解析器将整个XML文档加载到内存中的树形结构,方便随机访问,而SAX解析器则采用事件驱动的方式,逐行读取XML,适用于大文件或内存有限的情况。 2. **DOM解析**:通过`javax.xml.parsers.DocumentBuilderFactory`...

    JSTL-XML-Xpath

    接着,`&lt;x:path&gt;`标签可以用来执行XPath表达式,获取XML文档中的特定节点或数据。 例如,以下是一个简单的JSP页面示例,展示了如何使用JSTL的XML和XPath功能: ```jsp &lt;%@ taglib prefix="c" uri="http://java.sun...

    XML-java.rar_XML SAX_sax_sax xml_sax 解析 xml_xml using dom

    2. **SAX解析**:SAX是一种事件驱动的解析方式,它逐行读取XML文档,遇到元素、属性等时触发相应的事件处理器。这种方式节省内存,适合处理大型XML文件。"sax_xml sax_解析_xml"标签表明了本压缩包包含使用SAX解析...

    xpath-provider-plugin

    XPathFactory 用于创建 XPath 对象,XPath 对象可以编译 XPath 表达式为 XPathExpression,然后执行该表达式来获取 XML 文档中的节点集或单一值。然而,实际应用中,这个过程可能比较繁琐,XPath 提供者插件就是为了...

    ajax发送xml-java解析xml.doc

    通过XPath表达式,可以轻松地选取和操作XML中的特定元素,例如`SelectSingleNode("//title")`用于获取名为"title"的元素,并通过`InnerText`属性获取其文本内容。 总结,这个过程展示了如何使用Ajax将XML数据发送到...

    java与xml--初学者

    在Java中,我们可以使用`javax.xml.xpath`包中的类来执行XPath表达式。 4. **XSLT(可扩展样式表语言转换)**:用于将XML文档转换成其他形式,如HTML或另一个XML文档。Java提供了`javax.xml.transform`包来支持XSLT...

    Xerces-Java

    因此,Xerces-Java还提供了SAX解析器,它以事件驱动的方式处理XML文档,只在需要时读取数据,从而节省内存。SAX解析适合处理大文件或流式处理场景,但它的编程模型相对复杂,因为开发者需要实现事件处理器接口来响应...

    xml-apis.zip_JAVA XML_java xml_xml_zip

    虽然不在"xml-apis.jar"内,但Java通过`javax.xml.xpath`和`javax.xml.transform`包提供了对它们的支持。 总的来说,"xml-apis.zip" 提供的API对于任何涉及XML处理的Java项目都是必不可少的。无论是简单的XML读写,...

    用java读取修改xml文件的代码实现

    本文将详细介绍如何使用Java来读取和修改XML文件,主要涉及以下几个核心知识点: 1. **DOM解析器**: Document Object Model(DOM)是一种将XML文档转换为内存中的树形结构的方法,使得可以遍历和修改XML文件。...

    java xml-repair修复工具类

    在实际应用中,XML-repair工具类通常集成到XML解析或处理流程中,如在读取XML文件之前先进行修复,或者在接收到XML数据后立即进行处理。这样可以确保后续的操作,如XML解析、DOM构建、XPath查询等,都能顺利进行。 ...

    java对xml操作的项目案例

    Java程序可能会读取XML文件,解析出球员信息,如姓名、位置、得分等,并进行展示、统计或分析。例如,可以创建一个`Player`类,使用JAXB将XML数据绑定到Java对象,再进行业务逻辑处理。此外,可能还会涉及到XML的...

Global site tag (gtag.js) - Google Analytics