`
caizi12
  • 浏览: 177335 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

dom4j解析数组类型XML

    博客分类:
  • XML
阅读更多
   很久没写文章了,虽然这段时间接触了一些新的技术,之前也有了解过,但一直没有在实际项目开发中使用过,比如系统之间交互经常使用的WebService和JMS技术。根据甲方项目规划,如果系统之间交互的数据量比较大的话,首先采用JMS方式来发送接收数据,数据内容主要以XML格式为主,各项目组自行约定适合不同业务的XML文档格式。
  当系统接收到新的请求,就需要开始解析此消息XML内容。XML内容一般双方已经约定好了,格式比较固定,可通过Xpath形式直接解析到你想要的数据,但也有例外情况,比如接收到一个客户详细信息的XML,客户详细信息中的联系地址可能有多个,是一个数组此时就无法直接通过Xpath这样的方法来解析了,看以下代码
XML文档
<?xml version="1.0" encoding="UTF-8"?>
<doc>
	<body>
		<data name="userName">
			<field length="1"  type="string">老罗斯切尔德</field>
		</data>
		<data name="address_array"><!-- 联系地址 -->
			<array>
			  <struct>
					<data name="addressType">
						<field length="20" type="string">home</field>
					</data>
					<data name="content">
						<field length="20"  type="string">英国伦敦</field>
					</data>
				</struct>
				<struct>
					<data name="addressType">
						<field length="20"  type="string">company</field>
					</data>
					<data name="content">
						<field length="20"  type="string">英国</field>
					</data>
				</struct>
			</array>
		</data>
		 	</body>
</doc>


解析java方法,导入jar可直接运行

import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;

 
public class Dom4j {
	/**
	 * 获取指定xml文档的Document对象,xml文件应在classpath中可以找到
	 * 
	 * @param xmlFilePath
	 *            xml文件路径
	 * @return Document对象
	 */
	public static Document getDocument(String xmlFilePath) {
		SAXReader reader = new SAXReader();
		Document document = null;
		try {
			InputStream in = Dom4j.class.getResourceAsStream(xmlFilePath);
			document = reader.read(in);
			System.out.println("获取XML成功"); 
		} catch (DocumentException e) {
			System.out.println(e.getMessage());
			System.out.println("读取classpath下xmlFileName文件发生异常,请检查CLASSPATH和文件名是否存在!");
			e.printStackTrace();
		}
		return document;
	}

	static void getXmlArray(String xmlFileName) throws DocumentException {

		Document document = getDocument(xmlFileName);
		String dataName = null;
		Element parentElement = null;
		 
		//以Xpath形式来解析xml 获取整个xml中的数组类型节点
		List<Element> list = document.selectNodes("/doc/body/data/array");// array后面不要加”/“
		for (Iterator iterator = list.iterator(); iterator.hasNext();) {
			Element elem = (Element) iterator.next();
			parentElement = elem.getParent();
			// 取得父节点name值
			dataName = parentElement.attributeValue("name");

			// 解析地址信息数组
			if ("address_array".equals(dataName)) {
				List addList=	getAddress_array(elem);
				System.out.print("共有"+addList.size()+"个地址信息");
			}
			
		}
	}


	static List<HashMap<String, String>> getAddress_array(Element element) throws DocumentException {
		System.out.println("......解析地址信息数组开始......");
		List listStruct = element.elements("struct");//取得array节点下面所有struct节点

		List<HashMap<String, String>> dataList = new ArrayList<HashMap<String, String>>();
		HashMap<String, String> data_map = null;
		int i = 1;
		//循环获取struct节点
		for (Iterator itera = listStruct.iterator(); itera.hasNext();) {
			Node node_struct = (Node) itera.next();
			System.out.println("数组内容" + i+":"+node_struct.asXML());
			
			//取得struct节点下面的值,并生成一个document,用此document以Xpath形式获取下面所有的field节点
			List nodeFields = DocumentHelper.parseText(node_struct.asXML()).selectNodes("/struct/data/field");
			data_map = new HashMap<String, String>();
			for (Iterator iteraField = nodeFields.iterator(); iteraField.hasNext();) {

				Node nodeField = (Node) iteraField.next();
				String name_con = nodeField.getParent().valueOf("@name");

				if ("addressType".equals(name_con)) {
					System.out.println("addressType:" + nodeField.getText());
					data_map.put("addressType", nodeField.getText());
				} else if ("content".equals(name_con)) {
					System.out.println("content:" + nodeField.getText());
					data_map.put("content", nodeField.getText());
				}

			}
			dataList.add(data_map);
			i++;
		}
		return dataList;
	}

	
	
	 
	

	public static void main(String args[]) throws DocumentException {
		  getXmlArray("/contact.xml");
	}
}


目前只想到这种解析的方法,不知道还有没有其它更好的实现方法,欢迎大家讨论。
分享到:
评论

相关推荐

    dom4j、XStream的jar包

    DOM4J和XStream是Java开发中处理XML数据的两个重要工具,它们分别在XML文档解析和Java对象到XML的转换方面提供了强大的功能。 DOM4J是一个非常灵活且功能丰富的XML处理库,它提供了多种方式来操作XML文档,包括读取...

    dom4j-1.1.rar

    6. **XML编解码**:除了解析和创建XML文档,DOM4J还可以将XML文档编码为字节数组或写入到输出流,或者从字节数组或输入流中解码XML。 7. **性能优化**:DOM4J针对性能进行了优化,尤其在处理大量XML数据时,其内存...

    xml解析的jar包.rar

    4. **集合框架集成**:DOM4J与Java集合框架紧密集成,可以轻松地将XML元素转换为集合或数组。 5. **事件处理**:DOM4J支持SAX事件处理器,可以在解析XML时执行自定义操作。 在使用这些jar包时,首先需要将它们添加...

    java 对象与xml 相互序列化 xml4j (含源码)

    1. **解析XML文档**: XML4J首先需要解析XML文档,生成DOM树。解析器如Apache Xerces或Java内置的SAX解析器可以用于此任务。 2. **映射XML到Java**: 通过DOM树,XML4J识别元素和属性,将其映射回相应的Java类和字段...

    Java从xml文件里面读写图片

    当XML文件中图片数据以Base64编码的形式存储时,可以使用DOM4J解析XML,找到包含Base64字符串的元素,然后解码成二进制数据,最后用这些数据创建一个Image对象。这个过程通常涉及以下步骤: - 使用DOM4J的`...

    任意深度xml与bean的互转

    实现这一功能,通常会用到Java中的DOM(文档对象模型)、SAX(简单API for XML)或者Pull解析器等解析XML的方法,而在这个场景中,由于提到了"dom4j-1.6.1.jar"这个库,我们可以推测使用的是DOM4J库。DOM4J是一个...

    Excel2xml,excel文档解析

    本篇将深入探讨如何将Excel文件解析并转换为XML格式,主要涉及的技术包括Java中的Apache POI库和DOM4J库。 首先,Apache POI是Java领域用于读写Microsoft Office格式文件的库,其中包括Excel(XLS和XLSX)。通过POI...

    xml解析器(带相关jar包)

    提供的jar包可能包含解析器实现所需的库,如Java标准库中的`javax.xml.parsers`,用于提供DOM和SAX解析器,或者其他第三方解析库,如JDOM、DOM4J、Woodstox等。这些库提供了更高效、更方便的XML处理接口和功能。 ...

    解析XML文件(字符串)的两种方法

    #### dom4j解析XML时忽略DTD文件验证 在使用`SAXReader`或`DocumentHelper`解析XML时,默认情况下会验证DTD(Document Type Definition),这可能会导致解析速度变慢或者因为DTD文件不存在而抛出异常。为了提高效率...

    JAVA对xml操作

    通过`DocumentHelper.parseText()`方法可以直接将XML字符串解析为`org.dom4j.Document`对象。反过来,要将`Document`对象转换为字符串,只需调用`asXML()`方法。 3. **使用JDOM库**: JDOM提供了一个专为Java设计...

    java与xml 学习笔记整理

    另外,JDOM和DOM4J是两个流行的DOM替代库,提供了更友好的API来操作XML,尤其是对于复杂的XML结构。 JDOM简化了DOM的一些操作,它使用Java对象直接映射XML元素,使得操作更直观。DOM4J则在DOM的基础上进行了扩展,...

    利用java语言创建一个xml格式的文件

    ### 使用Java创建XML格式文件的知识点 #### 一、引言 在开发过程中,XML(可扩展标记语言)被广泛用于存储和传输数据。通过Java编程语言,我们可以...此外,使用DOM4J库处理XML文件比传统的SAX或DOM方式更加简单高效。

    AndroidManifest.xml 最新解析包

    6. **备用方案**:如果`AXMLPrinter`不可行,可以寻找其他XML解析库,比如`dom4j`、`jdom`等,它们提供了更丰富的异常处理机制。 理解`AndroidManifest.xml`的结构和作用,以及如何正确解析它是Android开发中的重要...

    解析xml数组,配置好节点IbpsBankCodeConf/ibps/ibp和xml字符串即可转换成List<Map<?,?>>

    "&lt;?xml version=\"1.0\" encoding=\"GB2312\" standalone=\"yes\"?&gt;"&lt;IbpsBankCodeConf&gt;" + " &lt;ibps code='322'&gt;" + " 测试银行' ECFlag='2' paySysBankCode='322290000011' eisBankCode='null' eisSiteCode='1' /...

    Xerces-J-bin.2.0.0.beta4.zip

    《Xerces-J-bin.2.0.0.beta4.zip:深入理解SAX XML解析器》 在IT领域,XML(可扩展标记语言)作为数据交换和存储的标准,被广泛应用于各种应用程序之间。为了处理XML文档,解析器是不可或缺的一部分。本文将详细...

    html js的一些实用技巧

    5. **DOM4J解析XML文档**: `dom4j解析xml文档.doc`会深入讲解DOM4J如何解析XML,包括获取元素、属性,以及遍历和操作XML树结构的方法。 6. **HTML列表标签`:ul`, `ol`, `li`, `dl`, `dt`, `dd`: `HTML中ul,ol,li,dl...

    SAX解析XML文件以及排序

    与DOM(Document Object Model)解析器不同,SAX采用事件驱动模型,逐行读取XML文件,不会一次性加载整个文档到内存,因此特别适合处理大文件。 SAX解析XML的基本流程如下: 1. 创建`SAXParserFactory`实例,通过`...

    xstream_1.4.3及其依赖包_xstream_1.4.3及其依赖包

    “解析xml文件需要用到jar包,内容包含xstream_1.4.3及_xstream_1.4.3 -dom4j及其依赖包”,这表明除了XStream本身之外,还包含了DOM4J库,因为DOM4J是一个强大的Java XML API,常被XStream用作默认的XML解析器。...

    java实现对xml的操作

    - **DOM4J**:这是一种流行的Java库,用于解析和操作XML文档。它可以非常高效地创建和操作XML文档,支持XPath查询,易于集成到Java项目中。 - **JaCOB**:这是一个用于Java与Windows COM组件交互的库,使得Java...

    java转换xml、list、map和json.pdf

    - 使用`dom4j`库可以解析XML文档为DOM(Document Object Model)对象,然后遍历DOM树将元素转换为Map。`DocumentHelper.createDocument()`方法创建一个新的XML文档对象,`Document`类代表整个XML文档。 - `Element...

Global site tag (gtag.js) - Google Analytics