从Coldfusion中的XML中提取名称/值对

时间:2011-11-12 03:30:08

标签: xml coldfusion

我需要从XML获取键/值对以填充网站上的成员信息。以下是XML的示例:

<a:PObject xmlns:b="http://schemas.datacontract.org">
<b:CanUpsert>true</b:CanUpsert>
<b:Fields xmlns:c="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
    <c:KeyValueOfstringanyType>
        <c:Key>FirstName</c:Key>
        <c:Value i:type="d:long" xmlns:d="http://www.w3.org/2001/XMLSchema">Joe</c:Value>
    </c:KeyValueOfstringanyType>
    <c:KeyValueOfstringanyType>
        <c:Key>LastName</c:Key>
        <c:Value i:type="d:long" xmlns:d="http://www.w3.org/2001/XMLSchema">Mama</c:Value>
    </c:KeyValueOfstringanyType>
</b:Fields>
</a:PObject>

我是XML的新手,并且在使用前缀方面遇到了困难。我使用以下内容给我一组键/值对:

<cfset keyValue = xmlSearch(soapBody,"//*[local-name()='Key'] | //*[local-name()='Value']") />

我能够通过索引引用我需要的数据;这在大多数情况下效果很好,但由于某些原因,并非每条记录都将其数据放在同一个地方。也就是说,#keyValue [4]#在95%的记录中起作用,但在少数记录中,给我一个完全不同的值!

我在这里和其他地方已经阅读了很多关于这个主题的帖子;没有人让我解决前缀问题。例如,我可以使用

按名称访问元素
<cfset firstNameKey = XmlSearch(soapBody,"//*[ text() = 'FirstName' ]") />

但我怎样才能得到相应的值?我已经尝试过使用follow-sibling,但一定不能正确地完成它...我甚至试图去掉所有的前缀 - 没有之后工作!

如果您有任何建议或建议可以提前给我,请大家多多谢谢。正如我所说的,我是XML的新手(也不是CF的先进版),我期待着指向正确的方向。非常感谢!

1 个答案:

答案 0 :(得分:1)

我建议使用比xpath更简单的方法 - 使用xmlparse()将XML字符串转换为对象,然后使用cf代码迭代所需的元素以构造名称 - 值对。 Cfdump XML对象以查看结果结构的样子 - 应该非常简单。试一试。

修改

在完成这项工作后,我有一些工作代码:

<cfsavecontent variable="xmldata">
<PObject xmlns:b="http://schemas.datacontract.org">
<b:CanUpsert>true</b:CanUpsert>
<b:Fields xmlns:c="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
    <c:KeyValueOfstringanyType>
        <c:Key>FirstName</c:Key>
        <c:Value type="d:long" xmlns:d="http://www.w3.org/2001/XMLSchema">Joe</c:Value>
    </c:KeyValueOfstringanyType>
    <c:KeyValueOfstringanyType>
        <c:Key>LastName</c:Key>
        <c:Value type="d:long" xmlns:d="http://www.w3.org/2001/XMLSchema">Mama</c:Value>
    </c:KeyValueOfstringanyType>
</b:Fields>
</PObject>
</cfsavecontent>

<cfset xmlObj = xmlParse(xmldata)>
<cfset valueArray = xmlSearch(xmlObj,"//*[local-name()='KeyValueOfstringanyType']")>
<cfset nameValuePairs = {}>
<cfloop from="1" to="#ArrayLen(valueArray)#" index="i">
        <cfset name = xmlSearch(valueArray[i], "c:Key")[1].xmlText>
        <cfset value = xmlSearch(valueArray[i], "c:Value")[1].xmlText>
        <cfset nameValuePairs[name] = value>
</cfloop>
<cfdump var="#nameValuePairs#">

注意,我必须稍微修改你的xml示例,因为有一些未定义的名称空间的引用。无论如何 - 以上对我有用。