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