xml coldfusion xml-parsing coldfusion-9

Análisis de archivo XML complejo utilizando Coldfusion



xml-parsing coldfusion-9 (2)

Estoy analizando un archivo XML con datos y especificaciones del vehículo. Tengo problemas al pasar por ciertos nodos para obtener múltiples valores. Aquí hay un código que tengo funcionando.

<cffile action="READ" file="c:/websites/db-utils/sample.xml" variable="xmlData"> <cfscript> myxmldoc = XmlParse(xmlData); modelNumber = XmlSearch(myxmldoc, "//basic_data/model_number"); modelNumber = modelNumber[1].XmlText; enginename = XmlSearch(myxmldoc, "//engines/engine"); enginename = enginename[1].XmlAttributes.name; camtype = XmlSearch(myxmldoc, "//engines/engine/cam_type"); camtype = camtype[1].XmlText; transmissionname = XmlSearch(myxmldoc, "//transmissions/transmission"); transmissionname = transmissionname[1].XmlAttributes.name; </cfscript> <cfoutput> Model Number: #modelNumber# <br /> Engine: #enginename#<br> Cam: #camtype#<br> Trans: #transmissionname#<br> </cfoutput>

El problema con el que tengo XML es cuando me vuelvo más profundo y necesito pasar por los nodos. Ella es un fragmento del XML.

<decoded_data> <decoder_messages></decoder_messages> <query_responses> <query_response identifier="1" transaction_id="CC969FDA9C2B546EEC0A8036F19C7A8543A7148E"> <query_error></query_error> <us_market_data> <us_styles count="1"> <style name="XLE 4dr Sedan" vehicle_id="400892838" complete="Y" market="US Light-Duty" fleet="N"> <basic_data></basic_data> <pricing></pricing> <engines></engines> <transmissions></transmissions> <specifications> <category name="Drive Type"><specification name="Drive Type">FWD</specification></category> <category name="Fuel Tanks"><specification name="Fuel Tank 1 Capacity (Gallons)">17</specification></category> <category name="Interior Dimensions"> <specification name="Cargo Volume">15.4</specification> <specification name="Passenger Volume">102.7</specification> </category> <category name="Measurements of Size and Shape"> <specification name="Front Track Width">62.4</specification> <specification name="Ground Clearance">6.1</specification> <specification name="Height">57.9</specification> <specification name="Length">190.9</specification> <specification name="Rear Track Width">62</specification> <specification name="Wheelbase">109.3</specification> <specification name="Width">71.7</specification> </category>

Aquí es donde estoy teniendo dificultades para encontrar cómo recorrer las especificaciones y las categorías dentro de ellas. También obteniendo tanto el ''nombre'' como la ''especificación'' real. Estoy yendo un poco en la dirección correcta con este código:

<cfset specNodes = xmlSearch(myxmldoc,''//specifications/category'')> <cfoutput> <cfloop from="1" to="#arraylen(specNodes)#" index="i"> <cfset specXML = xmlparse(specNodes[i])> #specXML#<br> </cfloop> </cfoutput>

Pero no estoy del todo allí ... cualquier ayuda sería apreciada.


Aquí es donde estoy teniendo dificultades para encontrar cómo recorrer las especificaciones y las categorías dentro de ellas.

Puedes intentar esto:

<!--- Get all category nodes under specifications. This will return an array ---> <cfset specNodes = xmlSearch(trim(xml), "//specifications/category")> <!--- loop over array containing category nodes ---> <cfoutput> <cfloop from="1" to="#arrayLen(specNodes)#" index="catCounter"> <!--- Get Name of the category ---> Category Name : #specNodes[catCounter].xmlAttributes.name#<br /> Specifications: <br /> <!--- Loop over specifications of current category ---> <cfloop from="1" to="#arrayLen(specNodes[catCounter].specification)#" index="specCounter"> <!--- Get specification name ---> Specification Name: #specNodes[catCounter].specification[specCounter].xmlAttributes.name#<br /> <!--- Get specification value ---> Specification Value: #specNodes[catCounter].specification[specCounter].xmlText#<br /> </cfloop> <br /><br /> </cfloop> </cfoutput>

Esto dará los siguientes resultados:

Category Name : Drive Type Specifications: Specification Name: Drive Type Specification Value: FWD Category Name : Fuel Tanks Specifications: Specification Name: Fuel Tank 1 Capacity (Gallons) Specification Value: 17 Category Name : Interior Dimensions Specifications: Specification Name: Cargo Volume Specification Value: 15.4 Specification Name: Passenger Volume Specification Value: 102.7 Category Name : Measurements of Size and Shape Specifications: Specification Name: Front Track Width Specification Value: 62.4 Specification Name: Ground Clearance Specification Value: 6.1 Specification Name: Height Specification Value: 57.9 Specification Name: Length Specification Value: 190.9 Specification Name: Rear Track Width Specification Value: 62 Specification Name: Wheelbase Specification Value: 109.3 Specification Name: Width Specification Value: 71.7


Puedes hacer eso de la siguiente manera:

<cfloop from="1" to="#arraylen(specNodes)#" index="i"> <h3>#specNodes[i].XmlAttributes.name#</h3> <cfset specChildren = specNodes[i].specification /> <cfloop from="1" to="#arraylen(specChildren)#" index="j"> <br/>#specChildren[j].XmlAttributes.name# = #specChildren[j].XmlText# </cfloop> </cfloop>

Lo que te da:

**Drive Type** Drive Type = FWD **Fuel Tanks** Fuel Tank 1 Capacity (Gallons) = 17 **Interior Dimensions** Cargo Volume = 15.4 Passenger Volume = 102.7 **Measurements of Size and Shape** Front Track Width = 62.4 Ground Clearance = 6.1 Height = 57.9 Length = 190.9 Rear Track Width = 62 Wheelbase = 109.3 Width = 71.7