ColdFusion解析所有XML子节点

时间:2015-03-08 22:11:54

标签: xml coldfusion

我已多次搜索网页,希望找到解决我的问题的解决方案,解决使用ColdFusion的XML Feed的所有节点但没有成功,所以我想我会看看你们中是否有人可以提供帮助。

为了使这个问题的方方面面清楚,具体细节。

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

问题:

  1. 在XML

  2. 中解析所有节点,包括子节点
  3. 在解析XML时,我或者只设法获取每个中心ID和 带有一个子日志节点的Dispatch ID,或者我获得中心ID和Dispatch 每个Dispatch重复XML文件中每个日志节点的ID 输出

  4. 目标:解析完整的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>
    

1 个答案:

答案 0 :(得分: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正在搜索整个文件,当您想要的只是在您想要的区域内搜索时。需要注意的是 - 你的一些变量会发生变化,所以请继续倾倒并观察它们应该如何出现。