2011-04-18 95 views
0

我几乎在这个项目。考虑下面的XML:.net到Coldfusion的Web服务XML解析

<diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1"> 
    <debtor xmlns="http://tempuri.org/Database.xsd"> 
     <Customer diffgr:id="Customer1" msdata:rowOrder="0" diffgr:hasErrors="true"> 
     <SeqNo>-1</SeqNo> 
     <AccGroup>1</AccGroup> 
     <AccountTypeID>1</AccountTypeID> 
     <CompaniesOfficeID>-4</CompaniesOfficeID> 
     <DOB /> 
     <SignupDate>18/04/2007</SignupDate> 
     <DeferredDate /> 
     <TeleSalesNo>5</TeleSalesNo> 
     <PIN>4433</PIN> 
     <Name>MR DAVID GETTI</Name> 
     <Salutation>MR</Salutation> 
     <FirstName>DAVID</FirstName> 
     <LastName>GETTI</LastName> 
     <Phone>64 7 555 522</Phone> 
     <Fax /> 
     <CellPhone>64 25 999 999</CellPhone> 
     <Email>[email protected]</Email> 
     <AfterHrs_Contact /> 
     <SalesNo>0</SalesNo> 
     <CreditStatus>1</CreditStatus> 
     <RefGroupNo>0</RefGroupNo> 
     <PriceNo>-1</PriceNo> 
     <SmartLineProvider>-1</SmartLineProvider> 
     <Contact>DAVID GETTI</Contact> 
     <CustomerCode>1111111</CustomerCode> 
     <HasCellPhone>false</HasCellPhone> 
     <InvoiceOptions>12</InvoiceOptions> 
     <TradingAs>MR DAVID GETTI</TradingAs> 
     <FranchiseCode>-1</FranchiseCode> 
     <Existing>true</Existing> 
     <Address diffgr:id="Address1" msdata:rowOrder="0"> 
      <SeqNo>-1</SeqNo> 
      <CustomerSeqNo>-1</CustomerSeqNo> 
      <Show>30</Show> 
      <TypeSelected>2</TypeSelected> 
      <Name>PostalAddress</Name> 
      <AddressNumber /> 
      <Address1>88 Blue Lane East</Address1> 
      <Address2>REMA</Address2> 
      <Address3>AKL</Address3> 
      <Address4 /> 
      <PostCode>1050</PostCode> 
      <LocationCode>0</LocationCode> 
      <AgentID>0</AgentID> 
     </Address> 
     <Address diffgr:id="Address2" msdata:rowOrder="1"> 
      <SeqNo>-2</SeqNo> 
      <CustomerSeqNo>-1</CustomerSeqNo> 
      <Show>10</Show> 
      <TypeSelected>2</TypeSelected> 
      <Name>PhysicalAddress</Name> 
      <AddressNumber /> 
      <Address1>44 OHINA STREET</Address1> 
      <Address2>REMA</Address2> 
      <Address3>AKL</Address3> 
      <Address4 /> 
      <PostCode>1098</PostCode> 
      <LocationCode>1</LocationCode> 
      <AgentID>1</AgentID> 
     </Address> 

我可以访问所有的数据,除详细地址并填充一个查询对象,使用下面的代码:

<cfset Local.xRows = Local.xData["diffgr:diffgram"]["debtor"] /> 
<cfloop from="1" to="#arrayLen(Local.xRows.xmlChildren)#" index="Local.i"> 
    <cfset Local.thisRow = Local.xRows.xmlChildren[Local.i] /> 
    <cfset Local.tableName = Local.thisRow.xmlName /> 
    <cfset queryAddRow(Local.result[Local.tableName], 1) /> 

    <cfloop from="1" to="#arrayLen(Local.thisRow.xmlChildren)#" index="Local.j"> 
     <cfif listfindnocase(vCols,Local.thisRow.xmlChildren[Local.j].xmlName)> 
      <cfset querySetCell(Local.result[Local.tableName], Local.thisRow.xmlChildren[Local.j].xmlName, Local.thisRow.xmlChildren[Local.j].xmlText, Local.result[Local.tableName].recordCount) /> 
     </cfif> 
    </cfloop> 
</cfloop> 

但是,我坚持了如何访问主地址节点下的各个地址细节节点:

<Address diffgr:id="Address1" msdata:rowOrder="0"> 

任何帮助将不胜感激。

+1

我希望你真的没有把Getti先生的电子邮件,电话号码和家庭住址给全世界。 – ale 2011-04-18 15:46:09

+0

是的,我搞砸了一切从名字到地址。他永远不会被识别! – user460114 2011-04-18 21:20:33

回答

0

我想你正在尝试引用那些使用绝对引用的单个节点,而不是通过使用cfloop获得的更简单的本地引用。

<cfset xmlCustomerInfo = xmlDoc.info[ "Customer" ][ Local.i ] /> 
<cfset arrAddressList = xmlCustomerInfo[ "Address" ] /> 

<cfloop 
    index="Local.j" 
    from="1" 
    to="#ArrayLen(arrAddressList)#" 
    step="1"> 

    <cfset innerAddressNode = arrAddressList[ Local.j ] /> 

</cfloop> 

这里有一些greatreferences到ColdFusion的XML解析。

警告:代码未经测试,仅基于您提供的内容以及Coldfusion如何分析Xml文档。

+0

感谢Dominic,我最终以此为起点。 – user460114 2011-04-18 21:19:22

+0

很高兴帮助!随意发布您所做的事情,以便我们作为社区可以从中学习。谢谢! – 2011-04-18 23:03:25