先做简单的代码分析:
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解析的文件及源码
分享到:
相关推荐
JAVA 解析XML和生成XML文档源码。比较全 1.DOM生成和解析XML文档 2.SAX生成和解析XML文档 3.DOM4J生成和解析XML文档 4.JDOM生成和解析XML
以下是使用 Java 实现 Word 文档解析和动态写入的代码实现: ```java public void downWord(HttpServletRequest request) throws IOException, ZipException, SAXException, ParserConfigurationException, ...
Java解析XML文件是Java开发中常见的一项任务,XML(eXtensible Markup Language)作为一种结构化数据存储格式,被广泛用于数据交换、配置文件和Web服务等场景。本篇文章将详细探讨Java如何利用DOM4J库来解析XML文件...
常用的java解析xml文档实例(常用的java解析xml文档实例){常用的java解析xml文档实例}
java心电图xml解析源码。
本示例着重于如何在Java环境中解析XML文件,并将其内容直接打印到打印机上,无需预览。 在Java中,有多种解析XML的方式,包括DOM(Document Object Model)、SAX(Simple API for XML)和StAX(Streaming API for ...
导入XML文件到Java程序中,通常涉及解析XML文档。Java提供了多种解析器,如DOM(Document Object Model)、SAX(Simple API for XML)和StAX(Streaming API for XML)。DOM解析器将整个XML文档加载到内存中的树形...
java xml文件DOM、SAX、DOM4j四种解析方式与性能对比。
使用java解析XML文件,解析完之后将解析结果导入mysql数据库中
java解析xml的四种方法的比较,还有四种方法所用到的jar包 附带程序例子 1.DOM生成和解析XML文档 2.SAX生成和解析XML文档 3.DOM4J生成和解析XML文档 4.JDOM生成和解析XML
* 本类是专门解析XML文件的,主要用于为系统读取自己的配置文件时提供最方便的解析操作 * @author HX * */ public class XmlManager { /** * 得到某节点下某个属性的值 * @param element 要获取属性的...
Java XML API是Java平台上的...通过这些API,开发者可以根据需求选择最适合的XML处理方式,不论是小型还是大型XML文件,都能有效地进行操作。在实际项目中,合理选择和组合使用这些API,能够提高代码的效率和可维护性。
JAVA解析XML文件四种方式比较,欢迎下载使用!
在这三个解析方法中,DOM适合小型XML文档的快速开发,SAX适合处理大型XML文件,而DOM4J则在DOM的基础上提供了更方便的API,但在内存效率方面介于DOM和SAX之间。选择哪种解析方式取决于具体应用场景,例如,如果需要...
- **解析XML**:使用DocumentFactory创建DocumentBuilder,然后用它来解析XML文件,得到Document对象。 - **遍历和操作节点**:通过Document对象获取Element节点,然后利用Element接口提供的方法(如elementList()...
Java 解析 XML 文件的 DOM 和 SAX 方式 Java 解析 XML 文件的 DOM 和 SAX 方式是指在 Java 中使用 Document Object Model(DOM)和 Simple API for XML(SAX)两种方式来解析 XML 文件的技术。下面将详细介绍这两种...
java XML解析方式实现自动生成word文档,文档中主要描述word模板的使用方法,文件中带有案例代码,可以方便理解
Java 解析XML性能分析Demo。包含了DOM解析,SAX解析, JDOM解析,DOM4J解析,JAXB解析例子。
- DOM解析器适用于小型XML文件,因为它将整个文档加载到内存中。 - SAX解析器适用于大型XML文件,因为它是事件驱动的,不需要将整个文档加载到内存。 - StAX解析器提供了一种流式处理方式,结合了DOM和SAX的优点,既...