ColdFusion解析所有XML子节点
我在网上搜索了很多次,希望找到解决我的问题的方法,用ColdFusion解析XML Feed的所有节点而没有成功,所以我想我会看看你们中的任何一位能否提供帮助。ColdFusion解析所有XML子节点
为了使这个问题的方面在这里明确是具体的。
编码语言:ColdFusion的10 数据源类型:XML 数据源文件:http://media.chp.ca.gov/sa_xml/sa.xml
问题:
解析的所有节点,包括儿童,在XML
解析XML时,我要么设法只获取每个中心ID,要么发送一个ID为1的调度ID子日志节点或我获得中心ID和调度 ID与XML文件中的每个日志节点重复,每个调度 输出。
目标:解析完整的XML并返回包括在同一层次与原始文件组织孩子日志节点每个节点。
我想建立一个公共安全模块,人们可以使用它来查看当前的交通事件的细节和位置。我一直在做这个和几个月的工作,并且已经发现了很多功能,但是困扰我的问题只是解析完整的XML以使用ColdFusion返回每个节点。
解析XML并将返回的数据传递到数据库一直非常简单,只是我没有得到完整的子节点集。我尝试过嵌套循环,但最终我得到了每个日志详细信息,每个调度位置的整个列表,在每个调度中重复,而不仅仅是属于特定调度节点的调度。有没有人有可能的解决方案?
我提供了一个到上面XML的链接,这里是XML结构的一个片段。
<State>
<Center ID="SAHB">
<Dispatch ID="SACC">
<Log ID="150306SA01531">
<LogTime>"Mar 6 2015 3:00PM"</LogTime>
<LogType>"1125-Traffic Hazard"</LogType>
<Location>"Sr99 S/Sr99 S Mack Rd E Ofr"</Location>
<LocationDesc>""</LocationDesc>
<Area>"South Sac"</Area>
<ThomasBrothers>""</ThomasBrothers>
<LATLON>"38476147:121424954"</LATLON>
<LogDetails>
<details/>
<units>
<UnitTime>"Mar 6 2015 3:03PM"</UnitTime>
<UnitDetail>"Unit Assigned"</UnitDetail>
</units>
<units>
<UnitTime>"Mar 6 2015 3:03PM"</UnitTime>
<UnitDetail>"Unit Assigned"</UnitDetail>
</units>
<units>
<UnitTime>"Mar 6 2015 3:03PM"</UnitTime>
<UnitDetail>"Unit Assigned"</UnitDetail>
</units>
.....
</LogDetails>
<Log ID="150306SA01531">
<LogTime>"Mar 6 2015 3:00PM"</LogTime>
<LogType>"1125-Traffic Hazard"</LogType>
<Location>"Sr99 S/Sr99 S Mack Rd E Ofr"</Location>
<LocationDesc>""</LocationDesc>
<Area>"South Sac"</Area>
<ThomasBrothers>""</ThomasBrothers>
<LATLON>"38476147:121424954"</LATLON>
<LogDetails>
<details/>
<units>
<UnitTime>"Mar 6 2015 3:03PM"</UnitTime>
<UnitDetail>"Unit Assigned"</UnitDetail>
</units>
<units>
<UnitTime>"Mar 6 2015 3:03PM"</UnitTime>
<UnitDetail>"Unit Assigned"</UnitDetail>
</units>
<units>
<UnitTime>"Mar 6 2015 3:03PM"</UnitTime>
<UnitDetail>"Unit Assigned"</UnitDetail>
</units>
.....
</LogDetails>
......
</Log>
</Dispatch>
</Center>
这是一个嵌套的循环测试,我也试图让每一个日志节点的例子,但这只是创建的每一个调度节点内返回每个日志节点的另一个实例,而不仅仅是那些是每个调度节点的直接子节点。
<pre>
<p><!--- Grab CHP XML feed --->
<cftry>
<cfhttp url="http://media.chp.ca.gov/sa_xml/sa.xml"
method="get"
resolveurl="yes"
throwonerror="yes"
timeout="7">
</cfhttp>
<cfcatch>
cfhttp failure
</cfcatch>
</cftry>
</p>
<p>
<cfoutput>
<cfset Level1XML = xmlSearch(CFHTTP.FileContent,'/State/Center')>
<cfset Level2XML = xmlSearch(CFHTTP.FileContent,'/State/Center/Dispatch')>
<cfset Level3XML = xmlSearch(CFHTTP.FileContent,'/State/Center/Dispatch/Log')>
<!---<cfdump var="#Level2XML#">--->
</p>
<p><!---Main Loop Begin--->
<cfloop from="1" to="#arraylen(Level1XML)#" index="x">
<cfset CenterXML = xmlparse(Level1XML[x])>
<span style="color:##F3C;">Count Level 1 = #x#</span>
<span style="color:##FF0000;"><strong>Center:</strong>#CenterXML.Center.XMLAttributes.ID#<br></span>
<!--- Dispatch Loop Begin--->
<cfloop from="1" to="#arraylen(Level2XML)#" index="y">
<cfset DetailsXML = xmlparse(Level2XML[y])>
<span style="color:##CC3300;">Count Level 2 = #y#</span>
<cfif CenterXML.Center.Dispatch.XMLAttributes.ID EQ DetailsXML.Dispatch.XMLAttributes.ID>
<span style="color:##00CC66;"><strong>Dispatch:</strong>#DetailsXML.Dispatch.XMLAttributes.ID#<br></span>
<cfif CenterXML.Center.Dispatch.Log.XMLAttributes.ID EQ DetailsXML.Dispatch.Log.XMLAttributes.ID>
<!---Log Loop begin--->
<cfloop from="1" to="#arraylen(Level3XML)#" index="z">
<span style="color:##00CC33;">Count Level 3 = #z#</span>
<cfset LogssXML = xmlparse(Level3XML[z])>
<strong>Log Time:</strong> #LogssXML.Log.LogTime.xmlText#<br>
<strong>Log Type:</strong> #LogssXML.Log.LogType.xmlText#<br>
<strong>Log Location:</strong> #LogssXML.Log.Location.xmlText#<br>
<strong>Log Area:</strong> #LogssXML.Log.Area.xmlText#<br>
<strong>Lat Lon:</strong> #LogssXML.Log.LATLON.xmlText#<br>
<cfif isdefined("LogssXML.Log.LogDetails.units.xmlText")>
<strong>Unit Time:</strong> #LogssXML.Log.LogDetails.units.UnitTime.xmlText#<br>
<strong>Unit Detail:</strong> #LogssXML.Log.LogDetails.units.UnitDetail.xmlText#<br><br>
</cfif>
</cfloop>
</cfif>
</cfif>
</cfloop>
</cfloop>
</cfoutput>
</pre>
你有问题就在这里
<cfset Level1XML = xmlSearch(CFHTTP.FileContent,'/State/Center')>
<cfset Level2XML = xmlSearch(CFHTTP.FileContent,'/State/Center/Dispatch')>
<cfset Level3XML = xmlSearch(CFHTTP.FileContent,'/State/Center/Dispatch/Log')>
你索引所有的XML文件,当你只希望相关部分各一次。很难在文本中解释...让我编码吧。
<!---Main Loop Begin--->
<cfloop from="1" to="#arraylen(Level1XML)#" index="x">
<cfset CenterXML = Level1XML[x]>
<cfset Level2XML = xmlSearch(CenterXML,'/State/Center/Dispatch')>
<!--- Dispatch Loop Begin--->
<cfloop from="1" to="#arraylen(Level2XML)#" index="y">
<cfset DetailsXML = Level2XML[y]>
<cfset Level3XML = xmlSearch(DetailsXML,'/State/Center/Dispatch/Log')>
<!---Log Loop begin--->
<cfloop from="1" to="#arraylen(Level3XML)#" index="z">
</cfloop>
</cfloop>
</cfloop>
看到,您的xmlSearch正在搜索整个文件,当你想要的只是在你想要的区域内搜索。谨慎的一点是 - 你的一些变量会改变,所以只要继续倾倒并观察它们应该如何出来。
我很好奇,如果它没有嵌套的xmls会明显更快目录操作搜索()。但XmlSearch使它更容易。 – abbottmw 2015-03-10 23:50:15
是的,马特,它肯定会更快地调用每个级别的xmlSearch一次,但更难得到你想要的数据。 – 2015-03-12 01:56:05
我猜你在XML文件中有不同的命名空间的问题。你能发布你的XML文件的头文件吗?它的重要性在于为你提供一个可行的解决方案。 (通过头文件,我只是指你的xml文档中的第几行代码 – 2015-03-10 01:46:06
我的确看到了一些看起来像是问题的东西,但也许这是你的例子中的一个错字,只显示我觉得有趣的部分。 XML文件中,我看到。后来我看到这个,所以是开放的,是开放的。再往下,被关闭 ,所以现在只有是开放的。然后打开另一个。现在我们有两个 s打开。最后,并非所有的东西都关闭了。 。还有一个没有关闭。是你的XML格式还是有更多我是没有看到? –
Mike
2015-03-10 11:26:23