3

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 充满了 NameSpaces 并且是动态的,所以它的结构经常变化。

4

1 回答 1

1

该函数local-name()返回标签名称的本地部分,在您的情况下,这正是表达式 '//*[local-name()='s:SessionID']' 不起作用的原因(您需要比较限定名称不仅仅是字符串)从你的问题看来,你有兴趣选择 SessionsID 元素,如果是这样的话,只使用 xpath 表达式SessionID

string xpath = "//s:SessionID";

如果它不起作用,那么您可能需要将前缀 s 与命名空间 uri s=\"sssssss\" 绑定(取自您的示例)

于 2017-09-22T09:16:47.007 回答