2015-03-08 245 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