如何用本地名称XPATH在C#上用冒号管理XML标记

问题描述:

这是我需要使用C#管理的更复杂XML的简化版本。如何用本地名称XPATH在C#上用冒号管理XML标记

问题是,当我尝试访问名称空间内的标记时,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,它是动态的,所以它的结构变化很频繁。

+1

*“”直接“路径”*是什么意思?你的XML有命名空间,你需要一个命名空间管理器来使用XPath。故事结局。 – Tomalak

+0

@Tomalak在线Xpath测试“直接”路径// * [local-name()='s:SessionID'没有任何管理命名空间的工作,为什么? – Andoxko

+1

如果这真的起作用,那是因为特定的在线XPath测试程序被破坏了。 'local-name()'永远不会返回类似'':SessionID''的东西。 – Tomalak

功能local-name()返回标记名称的本地部分,在你的情况正是SessionID这就是为什么表达式“// * [本地名称()=” S:的SessionID“]”不工作(你需要比较合格的名称不只是字符串) 从你的问题在我看来,你有兴趣在选择SessionsID元素,如果它因此只使用XPath表达式

string xpath = "//s:SessionID"; 

,如果它不工作比你可能需要将前缀s与命名空间绑定uri s = \“sssssss \”(从你的例子中)