Как управлять тегом 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\" (возьмите из вашего примера)