Получить определенный узел из объекта $(xData.responseXML)

Я полностью застрял в получении определенного узла из объекта responseXML, который я получил от GetUserProfileByName (SharePoint/SPServices). Мне нужен конкретный узел PropertyData (в примере "FirstName"), а затем получить значение "FirstName". Получение значения не является проблемой, получение конкретного узла...

Ниже часть возвращенного XML (для примера я удалил некоторые свойства):

...
<PropertyData>
   <Name>UserProfile_GUID</Name>
   <Values>
     <ValueData>
       <Value xmlns:q1="...">206b47c7-cfdc-...</Value>
     </ValueData>
   </Values>
</PropertyData>
<PropertyData>
   <Name>FirstName</Name>
   <Values>
     <ValueData>
       <Value xsi:type="xsd:string">Maarten</Value>
     </ValueData>
   </Values>
</PropertyData>
...

Поскольку я знаю, что мне нужно свойство FirstName, я не хочу перебирать весь набор узлов PropertyData, пока не найду правильный (медленный). В XPath я могу выбрать FirstName, просто сказав:

//PropertyData[Name='FirstName']/Values/ValueData/Value

Однако я не могу сделать это в объекте xData.responseXML. Пробовал следующий фильтр, находит и прочее (во всевозможных вариациях):

$(xData.responseXML).SPFilterNode("PropertyData").find("[Name*=FirstName]")

$(xData.responseXML).SPFilterNode("PropertyData").find("[Name*='FirstName']")

$(xData.responseXML).SPFilterNode("PropertyData").filter("[Name*=FirstName]")

$(xData.responseXML).SPFilterNode("PropertyData[Name='FirstName']")

Я сделал много поисков, но не смог найти ответ. Было много частичных ответов, которые я пробовал, но не работал. Любая подсказка...

Заранее спасибо! Мартен


person Maarten    schedule 08.11.2012    source источник


Ответы (1)


@Maarten Я сейчас не за компьютером, чтобы проверить, но попробуйте следующее:

$(xData.responseXML).find("Name:contains('FirstName')").closest("PropertyData")

ВЕРСИЯ 1. Учитывая ваши отзывы о том, что возвращается дополнительный элемент (фонетическое поле), вот измененный селектор, возвращающий только тот, который содержит элемент FirstName:

$(xData.responseXML)
     .find("Name:contains('FirstName')")
     .not(":contains('SPS-PhoneticFirstName')")
     .closest("PropertyData");

Павел

person Paul T.    schedule 09.11.2012
comment
Павел, вроде работает. Я все еще проверяю, есть ли еще элементы FirstName. Я вернул 2 узла, один для FirstName, а второй для SPS-PhoneticFirstName. Но я могу жить с этим лучше, чем перебирать 50 узлов! - person Maarten; 09.11.2012
comment
Я исправил то же самое выше, чтобы удалить фонетическое поле и вернуть только узел PropertyData, содержащий поле FirstName. - person Paul T.; 09.11.2012
comment
Павел, еще раз спасибо! Это работает для меня сейчас. Однако я не реализовал вашу последнюю версию. Я написал функцию, которая извлекает переданное имя свойства профиля SP. Поэтому я не могу ничего исключить, так как не знаю, какие существуют пользовательские свойства. - person Maarten; 09.11.2012