2015-03-08 81 views
0

我在网上搜索了很多次,希望找到解决我的问题的方法,用ColdFusion解析XML Feed的所有节点而没有成功,所以我想我会看看你们中的任何一位能否提供帮助。ColdFusion解析所有XML子节点

为了使这个问题的方面在这里明确是具体的。

编码语言:ColdFusion的10 数据源类型:XML 数据源文件:http://media.chp.ca.gov/sa_xml/sa.xml

问题:

  1. 解析的所有节点,包括儿童,在XML

  2. 解析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> 
+0

我猜你在XML文件中有不同的命名空间的问题。你能发布你的XML文件的头文件吗?它的重要性在于为你提供一个可行的解决方案。 (通过头文件,我只是指你的xml文档中的第几行代码 – 2015-03-10 01:46:06

+0

我的确看到了一些看起来像是问题的东西,但也许这是你的例子中的一个错字,只显示我觉得有趣的部分。 XML文件中,我看到<登录ID =“150306SA01531”>。后来我看到这个,所以是开放的,< LogDetails>是开放的。再往下,被关闭,所以现在只有是开放的。然后<登录ID =“150306SA01531”>打开另一个。现在我们有两个 s打开。最后,并非所有的东西都关闭了。。还有一个没有关闭。是你的XML格式还是有更多我是没有看到? – Mike 2015-03-10 11:26:23

回答

0

你有问题就在这里

<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正在搜索整个文件,当你想要的只是在你想要的区域内搜索。谨慎的一点是 - 你的一些变量会改变,所以只要继续倾倒并观察它们应该如何出来。

+0

我很好奇,如果它没有嵌套的xmls会明显更快目录操作搜索()。但XmlSearch使它更容易。 – abbottmw 2015-03-10 23:50:15

+0

是的,马特,它肯定会更快地调用每个级别的xmlSearch一次,但更难得到你想要的数据。 – 2015-03-12 01:56:05