【发布时间】:2017-09-22 08:04:50
【问题描述】:
这是一个更复杂的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 并且是动态的,所以它的结构经常变化。
【问题讨论】:
-
""直接"路径"是什么意思?您的 XML 具有名称空间,您需要一个名称空间管理器才能在其上使用 XPath。故事结束。
-
@Tomalak 使用在线 Xpath 测试“直接”路径 //*[local-name()='s:SessionID' 在没有任何命名空间管理的情况下工作,这是为什么呢?
-
如果这真的有效,那是因为那个特定的在线 XPath 测试器坏了。
local-name()永远不会返回像's:SessionID'这样的东西。 -
话虽如此,请不要在 XPath 表达式中使用
local-name()。这是错误的工具。没有什么“直接”的。如果您的 XML 具有名称空间,请正确使用它们。这并不难,所以没有理由不这样做。 -
Jup,我刚刚确认了——XPath 测试器的
local-name()函数坏了。 :) 试试这里,这个做对了:freeformatter.com/xpath-tester.html 对了,你可以使用Powershell的Select-Xmlcmdlet在你自己的机器上快速本地测试XPath。只需打开 Powershell ISE,您就有了一个快速简便的测试平台,甚至可以访问您的所有本地文件。
标签: c# xml xpath xmldocument uft-api