Как управлять тегом XML с двоеточием на C# с локальным именем XPATH

Это упрощенная версия более сложная XML что мне нужно справиться с C#,

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

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml("<s:Body xmlns:s=\"sssssss\"><s:SessionID>abcde</s:SessionID></s:Body>");
string xpath = "//*[local-name()='s:SessionID']";
Context.UserLogger.Info(xmlDoc.SelectSingleNode(xpath).InnerText);
//Object reference not set to an instance of an object

Но код отлично работает без двоеточия на теге.

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml("<s:Body xmlns:s=\"sssssss\"><SessionID>abcde</SessionID></s:Body>");
string xpath = "//*[local-name()='SessionID']";
Context.UserLogger.Info(xmlDoc.SelectSingleNode(xpath).InnerText);
//abcde

На валидаторе XPATH я убедился, что "//*[local-name()='s:SessionID']" работает нормально.

Чего мне не хватает?

Заранее спасибо,

Я прочитал информацию о XmlNamespaceManager но я бы предпочел использовать "прямые" пути. XML полон пространств имен и динамичен, поэтому его структура меняется довольно часто.

1 ответ

Функция local-name() возвращает только локальную часть имени тега, которая в вашем случае точно SessionID вот почему выражение '//*[local-name()='s:SessionID']' не работает (вам нужно сравнивать квалифицированные имена, а не только строки). Из вашего вопроса мне кажется, что вы заинтересованы в выборе элементы SessionsID, если это так, используйте только выражение xpath

string xpath = "//s:SessionID";

если это не работает, то вам, вероятно, нужно связать префиксы s с пространством имен uri s=\"sssssss\" (возьмите из вашего примера)

Другие вопросы по тегам