GetSingleNode в XML с пространством имен не работает - PullRequest
0 голосов
/ 19 июня 2019

Мне нужно работать с Глобальным списком из TFS. Я скачал его, и у меня есть доступ к XML, который имеет пространство имен. Я создал XmlNamespaceManager, но у меня все еще есть проблемы с получением нужного мне узла. Для тех, кто не знаком, Глобальный список TFS выглядит следующим образом:

<gl:GLOBALLISTS xmlns:gl="http://schemas.microsoft.com/VisualStudio/2005/workitemtracking/globallists">
    <GLOBALLIST name="Builds">
        <LISTITEM value="..." />
    </GLOBALLIST>
...
    <GLOBALLIST name="Client Name">
        <LISTITEM value="Test" />

После загрузки глобального списка в XmlDocument я использую следующий код, чтобы попытаться извлечь тестовый узел, но я получаю нулевое значение обратно.

Dim globalList As XmlDocument = store.ExportGlobalLists()
Dim nsManager As XmlNamespaceManager = New XmlNamespaceManager(globalList.NameTable)
nsManager.AddNamespace("gl", "http://schemas.microsoft.com/VisualStudio/2005/workitemtracking/globallists")
Dim node As XmlNode = globalList.SelectSingleNode("//gl:GLOBALLISTS/gl:GLOBALLIST[@name='Client Name']/gl:LISTITEM[@value='" + Name + "']", nsManager)

Как примечание, имя, которое я ищу, существует. Я также попробовал следующее в ближайшем окне:

globalList.SelectNodes("/gl:GLOBALLISTS", nsManager)
Expression has been evaluated and has no value
globalList.SelectSingleNode("//gl:GLOBALLISTS/gl:GLOBALLIST[name='Client Name']/gl:LISTITEM[value='" + Name + "']", nsManager)
Expression has been evaluated and has no value
globalList.SelectSingleNode("//gl:GLOBALLIST[name='Client Name']/gl:LISTITEM[value='" + Name + "']", nsManager)
Expression has been evaluated and has no value
globalList.SelectSingleNode("//gl:GLOBALLIST[name='Client Name']", nsManager)
Expression has been evaluated and has no value
globalList.SelectSingleNode("//gl:GLOBALLIST", nsManager)
Expression has been evaluated and has no value
globalList.SelectSingleNode("//gl:GLOBALLISTS/GLOBALLIST[name='Client Name']/LISTITEM[value='Test']", nsManager)
Expression has been evaluated and has no value
globalList.SelectSingleNode("/gl:GLOBALLISTS/gl:GLOBALLIST[@name='Client Name']/gl:LISTITEM[@value='" + Name + "']", nsManager)
Expression has been evaluated and has no value

РЕШЕНИЕ

Мне пришлось убрать ссылки на пространство имен, за исключением первого узла, и добавить знак @ для доступа к атрибутам, как предложено в ответе ниже.

Dim node As XmlNode = globalList.SelectSingleNode("//gl:GLOBALLISTS/GLOBALLIST[@name='Client Name']/LISTITEM[@value='" + Name + "']", nsManager)

1 Ответ

1 голос
/ 20 июня 2019

В XPath атрибуты указываются с помощью @. Похоже, именно поэтому у вас возникли проблемы, поскольку вы не используете @.

Кроме того, как вы обнаружили самостоятельно, в пространстве имен находится только самый внешний элемент, поэтому только первый сегмент должен иметь gl:.

Dim node As XmlNode = globalList.SelectSingleNode("/gl:GLOBALLISTS/GLOBALLIST[@name='Client Name']/LISTITEM[@value='" + Name + "']", nsManager)
...