【问题标题】:How to manage a XML tag with a colon on C# with a local-name XPATH [duplicate]如何使用本地名称 XPATH 在 C# 上管理带有冒号的 XML 标记 [重复]
【发布时间】: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-Xml cmdlet在你自己的机器上快速本地测试XPath。只需打开 Powershell ISE,您就有了一个快速简便的测试平台,甚至可以访问您的所有本地文件。

标签: c# xml xpath xmldocument uft-api


【解决方案1】:

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

string xpath = "//s:SessionID";

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-09
    相关资源
    最近更新 更多