【问题标题】:Make selectnode insensitive to uppercase or lowercase with namespaces使用命名空间使 selectnode 对大写或小写不敏感
【发布时间】:2017-10-24 04:24:28
【问题描述】:

我有以下 XML:

<myfile:bookstore>
<myfile:books>
<myfile:book> Book 1</myfile:book>
<myfile:book> Book 2</myfile:book>
</myfile:books>
</myfile:bookstore>

以下代码选择&lt;myfile:books&gt;节点:

XmlNamespaceManager nsmgr = new 
XmlNamespaceManager(el.OwnerDocument.NameTable);
nsmgr.AddNamespace("myfile", 
el.OwnerDocument.DocumentElement.NamespaceURI);

var node = el.SelectSingleNode(@"/myfile:bookstore/myfile:books", nsmgr);

在节点名称为myfile:boOkSmyfile:BOOKS 不区分大小写之前,如何使这个工作?

另一个问题是我的 namespaceManager 吗?能不能简单点?

【问题讨论】:

  • 如果我想要的节点是这样的示例: OR 我希望它适用于所有情况

标签: c# xml xpath xml-namespaces selectsinglenode


【解决方案1】:

您可以使用local-name()namespace-uri() 函数在XPath 查询中返回元素名称和命名空间,然后使用translate() 函数将本地名称小写。

因此以下应该有效:

var elementName = "books"; // Or whatever
var nameSpaceUri = el.OwnerDocument.DocumentElement.NamespaceURI;
var xpathQuery = string.Format(@"/myfile:bookstore/*[translate(local-name(), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')='{0}' and namespace-uri()='{1}']", elementName, nameSpaceUri);
var node = el.SelectSingleNode(xpathQuery, nsmgr);

示例工作.Net fiddle

请注意,在这种情况下应避免将name() 函数的返回值小写。例如。您可能会尝试执行以下操作:

var node = el.SelectSingleNode(@"/myfile:bookstore/*[translate(name(), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz') = 'myfile:books']", nsmgr);

但是,不应使用,因为它会将名称空间prefix myfile: 硬编码在字符串文字'myfile:books' 中。如果稍后输入 XML 被修改为使用不同的前缀——或者根本没有前缀,例如:

<bookstore xmlns="http://MyRootNameSpace">
  <Books>
    <Book> Book 1</Book>
    <Book> Book 2</Book>
  </Books>
</bookstore>

那么,尽管新 XML 在语义上与旧 XML 相同,但您的 XPath 查询会中断。

【讨论】:

  • 完美!谢谢!
  • @E.Hayes - 很高兴为您提供帮助。如果问题得到解答,请mark it as such
  • 我不知道如何
  • @E.Hayes - 说明在我评论内的链接中:meta.stackexchange.com/questions/147531/…。由于您是 stackoverflow 的新手,因此您可能需要参加 tour,它在此处解释了提问和回答问题的机制。
猜你喜欢
  • 2017-02-21
  • 1970-01-01
  • 1970-01-01
  • 2021-12-21
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
  • 2011-01-22
  • 1970-01-01
相关资源
最近更新 更多