Извлечение пар имя / значение из XML в Coldfusion - PullRequest
1 голос
/ 12 ноября 2011

Мне нужно получить пары ключ / значение из 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' ]") />

, но как мне получить соответствующее значение?Я попытался использовать следующий брат, но, должно быть, не сделал это правильно ... Я даже попытался удалить все префиксы - ничего не сработало после этого!

Большое спасибо всем заранее за любые советы или предложения, которые вы можете мне дать.Как я уже сказал, я новичок в XML (и не настолько продвинут в CF), и с нетерпением жду, когда меня укажут в правильном направлении.Большое спасибо!

1 Ответ

1 голос
/ 12 ноября 2011

Я бы предложил более простое средство, чем xpath - преобразовать строку XML в объект с помощью xmlparse (), а затем выполнить итерации по нужным элементам, используя код 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, так как были некоторые ссылки на пространства имен, которые не были определены. Во всяком случае - вышеупомянутое работает для меня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...