如何用本地名称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,它是动态的,所以它的结构变化很频繁。
答
功能local-name()
返回只标记名称的本地部分,在你的情况正是SessionID
这就是为什么表达式“// * [本地名称()=” S:的SessionID“]”不工作(你需要比较合格的名称不只是字符串) 从你的问题在我看来,你有兴趣在选择SessionsID元素,如果它因此只使用XPath表达式
string xpath = "//s:SessionID";
,如果它不工作比你可能需要将前缀s与命名空间绑定uri s = \“sssssss \”(从你的例子中)
*“”直接“路径”*是什么意思?你的XML有命名空间,你需要一个命名空间管理器来使用XPath。故事结局。 – Tomalak
@Tomalak在线Xpath测试“直接”路径// * [local-name()='s:SessionID'没有任何管理命名空间的工作,为什么? – Andoxko
如果这真的起作用,那是因为特定的在线XPath测试程序被破坏了。 'local-name()'永远不会返回类似'':SessionID''的东西。 – Tomalak