`
jsjxqjy
  • 浏览: 118290 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Java基础 XML文件的解析

阅读更多

先做简单的代码分析:

 1.由于主要是取出结点的属性 ,需要一定数据存储结构

   ArrayList<DetailData> detailList = null

 

 public class DetailData {
  private String buildingName = "";
  private String floorName = "";
  private String lineName = "";
  private HashMap<String, String> detailMap = null;

}

 

问题需要简单化,一个方法只做一样事情

/**
	 * 迭代child结点
	 * @param node
	 * @param map
	 */
	public void getChild(Node node, HashMap<String, String> map) {

		if (node.hasAttributes()) {
			getAttrByNode(node, map);

		}
		if (node.hasChildNodes()) {
			NodeList n2 = node.getChildNodes();
			for (int j = 0; j < n2.getLength(); j++) {
				getChild((Node) n2.item(j), map);
			}
		}
	}

 

   取出每个节点的属性

/**
	 * 得到当前结点的属性
	 * @param node
	 * @param map
	 */
	public void getAttrByNode(Node node, HashMap<String, String> map) {

		if (node.hasAttributes()) {

			NamedNodeMap nnm = node.getAttributes();

			int len = nnm.getLength();

			for (int j = 0; j < len; j++) {

				Node attr = nnm.item(j);

				map.put(attr.getNodeName(),
						setValueForNull(attr.getNodeValue()));
			}
		}
	}

 

上面的递归对于下面的XML结构绝对没有问题:

<?xml version="1.0" encoding='UTF-8'?>
<requestSummary currentTime=''  startDay='2009-12-23' endDay='2009-12-23'>
	<dailySummary day='2008-03-01' totalCall='298'
		avgResponseTime='00:05' avgRepairTime='00:35'>
	</dailySummary>
	<dailySummary day='2008-03-01' totalCall='340'
		avgResponseTime='00:03' avgRepairTime='00:50'>
	</dailySummary>
</requestSummary>

 

 但是对于下面的结构:就应付不了:

<?xml version="1.0" encoding='UTF-8'?>
<requestSummary currentTime=''  startDay='2009-12-23' endDay='2009-12-23'>
<building building='2'>
      <floor floorName='1'>
	<line lineName='N1'>
		<completedInfo seatNo='12' ticket='1'>
			<completedDetail requestTime='43223556647'
					requestStaffNo='H0051' requestStaffName='张三'>
			</completedDetail>
		</completedInfo>
		<completedInfo seatNo='13' ticket='2'>
			<completedDetail requestTime='43223556647'
					requestStaffNo='H0050' requestStaffName='小王'>
			</completedDetail>
		</completedInfo>
	</line>
     </floor>
</building>

</requestSummary>

 

 在line结点下会出现多个completedInfo ,而且 building结点也会出现多个的。这样就复杂点了,但是有了上面的递归思想,我们仍然还是有办法的:

 

我们的思路就是需要一个数据结构,可以把completedInfo 结点为依据的记录,作为一个对象 ,完整的把它的所有属性全部存入这个对象,这个对象是DetailData  ,分公共数据 buildingName ; floorName ;lineName和completedInfo(detailMap结点数据)

不过后来发现这个结构也是有问题的:数据会不正确,后来,就把completedInfo节点的父节点全部,放进HashMap中了,这样保证一个对象的Map只存储与之一致的记录

 

第一步,查找孩子结点及父结点

 

	public void getChildForDetail(Node node) {

		if (node.hasAttributes()) {
			DetailData detailData = new DetailData();

			// setBuildingName
			detailData.setBuildingName(buildingName);

			HashMap<String, String> detailMap = new HashMap<String, String>();

			if ("completedInfo".equals(node.getNodeName())) {

				// 下面的代码为InProgressRequest特制------
				Node parent = node.getParentNode();
				String pName = parent.getNodeName();
				if ("line".equals(pName)) {
					getParentAttr(parent,detailMap);
				}
				
				//为InProgressRequest特制 End-----
				getChildAttrByNode(node, detailMap);
				
				// setDetailMap
				detailData.setDetailMap(detailMap);

				// detailData 对象添加
				detailList.add(detailData);
			}

		}
		if (node.hasChildNodes()) {
			NodeList n2 = node.getChildNodes();
			for (int j = 0; j < n2.getLength(); j++) {
				getChildForDetail((Node) n2.item(j));
			}
		}
	}

  第2步:取出结点的属性

 

/**
	 * 取出detailDate信息
	 * 
	 * @param node
	 *            当前节点
	 * @param detailMap
	 *            存储当前节点及子节点的所有属性信息
	 */
	public void getChildAttrByNode(Node node,
			HashMap<String, String> detailMap) {

		if (node.hasAttributes()) {
			NamedNodeMap nnm = node.getAttributes();
			int len = nnm.getLength();

			for (int j = 0; j < len; j++) {

				Node attr = nnm.item(j);
				detailMap.put(attr.getNodeName(), setValueForNull(attr
						.getNodeValue()));
			}

		}

		if (node.hasChildNodes()) {
			NodeList n2 = node.getChildNodes();
			for (int j = 0; j < n2.getLength(); j++) {
				getChildAttrByNode((Node) n2.item(j), detailMap);
			}
		}
	}

 

随着项目的进展后来 ,又出现了其他的情况:

<?xml version="1.0" encoding='UTF-8'?>
<requestSummary currentTime=''  startDay='2009-12-23' endDay='2009-12-23'>
<building building='2'>
   <floor floorName='1'>
	<line lineName='N1'>
		<completedInfo seatNo='12' ticket='1'>
			<completedDetail requestTime='43223556647'
					requestStaffNo='H0051' requestStaffName='张三'>
			</completedDetail>
			<completedDetail requestTime='43223556647'
					requestStaffNo='H0050' requestStaffName='小王'>
			</completedDetail>
		</completedInfo>
	</line>
     </floor>
</building>
</requestSummary>

 关键性的节点循环的地方发生变化

同样的,都不难,我们还是可以解决!

 

 xml解析的文件及源码

分享到:
评论
4 楼 jsjxqjy 2009-06-26  
jomper 写道
LZ和我的初衷一样,我也写过一个基于W3C DOM的XML2Object,Object2XML的工具,互相学习。
传送门:依旧简单的小工具XMLUtil


O(∩_∩)O谢谢,呵呵,是啊,这个解析是我和师傅一起研究了到晚上2点,才出来的。
不容易啊 ,终于有人和我有一样的初衷
3 楼 jomper 2009-06-26  
LZ和我的初衷一样,我也写过一个基于W3C DOM的XML2Object,Object2XML的工具,互相学习。
传送门:依旧简单的小工具XMLUtil
2 楼 jsjxqjy 2009-06-26  
<p>恩,是的dom4j是很方便,但是使用JDK自带的东西W3C 主要是业务需求,当解决实际问题的时候,你会发现dom4j来解决不够用,所以才自己写了个解析的 你可以解析下面的格式试验下,用Dom4j</p>
<p> </p>
<pre name="code" class="java">&lt;test currentTime='' startDay='2009-12-23'
endDay='2009-12-23'&gt;
&lt;building buildingName='1'&gt;
&lt;floor floorName='1'&gt;
&lt;line lineName='N1'&gt;
&lt;completedInfo seatNo='11' responseTime='11:25'
RepairTime='11:23'&gt;
&lt;completedDetail requestTime='11:23'
requestStaffNo='H0050' requestStaffName='张三' responseTime='11:25'
responseStaffNo='J332' responseStaffName='李四' completeTime='11:50'
completeStaffNo='Y6500' completeStaffName='梁五'&gt;
&lt;/completedDetail&gt;
&lt;/completedInfo&gt;

&lt;completedInfo seatNo='12' responseTime='11:25'
RepairTime='11:23'&gt;
&lt;completedDetail requestTime='11:23'
requestStaffNo='H00501' requestStaffName='张三1' responseTime='11:25'
responseStaffNo='J3321' responseStaffName='李四1' completeTime='11:50'
completeStaffNo='Y65001' completeStaffName='梁五1'&gt;
&lt;/completedDetail&gt;
&lt;/completedInfo&gt;
&lt;/line&gt;
&lt;/floor&gt;
&lt;/building&gt;

&lt; /test &gt;</pre>
<p> 如果解析出来了,把代码贴出来看哈,O(∩_∩)O谢谢指教</p>
1 楼 lzmhehe 2009-06-26  
有dom4j jdom xstream digester,为什么还要自己写啊

有那时间看看 socket thread collection 都比这个实在

相关推荐

    JAVA 解析XML生成XML文档实例

    JAVA 解析XML和生成XML文档源码。比较全 1.DOM生成和解析XML文档 2.SAX生成和解析XML文档 3.DOM4J生成和解析XML文档 4.JDOM生成和解析XML

    java实现xml解析word文档代码实现

    以下是使用 Java 实现 Word 文档解析和动态写入的代码实现: ```java public void downWord(HttpServletRequest request) throws IOException, ZipException, SAXException, ParserConfigurationException, ...

    java心电图xml解析.zip

    2. SAX解析:SAX是一种事件驱动的解析器,它逐行读取XML文件,当遇到元素、属性等结构时触发回调函数。这种方式节省内存,但编程相对复杂,需要编写事件处理器来响应解析过程中的事件。对于大型心电图数据,SAX解析...

    java 解析xml 多级

    DOM解析器会将整个XML文件加载到内存中,形成一个树形结构,适合处理小到中等规模的XML文档。而SAX解析器采用事件驱动的方式,逐行读取XML文件,适合处理大型XML文件以避免内存消耗。 对于多级XML,DOM解析更便于...

    java解析XML文件

    Java解析XML文件是Java开发中常见的一项任务,XML(eXtensible Markup Language)作为一种结构化数据存储格式,被广泛用于数据交换、配置文件和Web服务等场景。本篇文章将详细探讨Java如何利用DOM4J库来解析XML文件...

    java xml文件解析

    在Java中,有多种解析XML文件的方式,包括DOM (Document Object Model)、SAX (Simple API for XML) 和 DOM4J。这些方法各有优势和局限性,选择哪一种取决于具体的应用场景和需求。 #### 二、DOM 解析方式 DOM 解析...

    使用java解析XML文件,解析完之后将解析结果导入mysql数据库中

    在Java编程环境中,解析XML文件是一项常见的任务,特别是在数据处理和集成中。XML(Extensible Markup Language)是一种结构化数据格式,广泛用于存储和传输数据。本教程将介绍如何使用Java解析XML文件,并将解析...

    JavaXml.zip_java xml_javaXML_java解析xml_文档解析

    在Java中,有多种方式可以解析XML文档,包括DOM(Document Object Model)、SAX(Simple API for XML)和StAX(Streaming API for XML)。下面我们将详细探讨这些解析方法以及相关的API。 1. DOM解析器:DOM解析器...

    java 解析XML性能对比分析Demo

    在"Java解析XML性能对比分析Demo"中,你可以通过运行这些解析器的示例代码,观察它们在处理相同XML文件时的内存占用、处理速度等指标,以了解哪种解析方式更适合你的项目需求。例如,如果你处理的XML文件较小,DOM或...

    java XML解析方式实现自动生成word文档

    3. 加载XML模板:读取XML文件,这可以是预先定义好的模板,包含需要替换的占位符。 ```java File xmlTemplate = new File("template.xml"); InputStream is = new FileInputStream(xmlTemplate); ``` 4. 解析XML:...

    java大作业xml解析

    XML文件以.xml为后缀,其结构清晰,易于人类阅读和机器解析。 XML的基本结构由元素、属性、注释、处理指令等组成。元素是XML文档的核心,它们以尖括号包围,如 `&lt;element&gt;`。属性提供额外的信息,例如 `...

    java解析xml字符串

    Java提供了多种库来解析和操作XML文档,其中JDOM(Java Document Object Model)是一个广泛使用的开源库,它提供了简单且强大的API来读取、创建和修改XML文档。 ### Java解析XML字符串 在给定的代码示例中,我们...

    java导入导出xml文件

    导入XML文件到Java程序中,通常涉及解析XML文档。Java提供了多种解析器,如DOM(Document Object Model)、SAX(Simple API for XML)和StAX(Streaming API for XML)。DOM解析器将整个XML文档加载到内存中的树形...

    java解析XML的四种方式

    然而,使用DOM进行解析和修改文档时,可能会消耗大量的内存资源,尤其是在处理大型XML文件时。因此,在需要频繁修改XML结构或者需要快速查询的情况下,DOM是一个不错的选择,但在处理超大文件时,可能需要考虑更轻量...

    JAVA调用webservice并解析xml

    总结,调用Java中的Web服务并解析XML涉及到了Web服务的基础概念、Java的Web服务客户端创建、XML解析技术以及实际的调用与响应处理。熟练掌握这些知识点,能够帮助开发者有效地集成和利用各种Web服务资源。

    Java解析XML的jar包+四种解析方法

    java解析xml的四种方法的比较,还有四种方法所用到的jar包 附带程序例子 1.DOM生成和解析XML文档 2.SAX生成和解析XML文档 3.DOM4J生成和解析XML文档 4.JDOM生成和解析XML

    Java解析XML工具类--(java源码)

    * 本类是专门解析XML文件的,主要用于为系统读取自己的配置文件时提供最方便的解析操作 * @author HX * */ public class XmlManager { /** * 得到某节点下某个属性的值 * @param element 要获取属性的...

    java xml.java操作XML文档

    Java XML API是Java平台上的...通过这些API,开发者可以根据需求选择最适合的XML处理方式,不论是小型还是大型XML文件,都能有效地进行操作。在实际项目中,合理选择和组合使用这些API,能够提高代码的效率和可维护性。

    Java解析XML.zip

    本压缩包“Java解析XML.zip”包含了两个关键的第三方库:jaxen-1.1.1.jar和dom4j-1.6.1.jar,它们是Java解析XML文件的重要工具。 首先,让我们了解一下**DOM4J**。DOM4J是一个强大的Java XML API,它提供了灵活且高...

Global site tag (gtag.js) - Google Analytics