具有XPath的SelectNodes忽略节点名称中的个案

时间:2012-06-15 10:06:48

标签: c# xml xpath case-insensitive selectsinglenode

我遇到类似问题SelectNodes with XPath ignoring cases的问题,但在我的情况下,大写/小写问题出现在名为'application'的节点中(有时是'Application',其他时候是'application')。

我如何应用其他帖子的解决方案?或者在这种情况下适用另一种?

的xml:

<?xml version="1.0" encoding="utf-16" ?>
<application>
  <forms>
    <action type="update">
      <form uid="" >
      </form>
    </action>
  </forms>
</application>

在C#3.5中:

XmlNode nodex= oXMLDoc1.SelectSingleNode("Application/forms/action/form/@uid")
nodex.Value="UniqueIDx";//nodex is null :S

4 个答案:

答案 0 :(得分:5)

我们可能会将xml和我们的变量转换为小写。

string value = "aBc";
XmlNode xmlnode = xmldoc.SelectSingleNode(string.Format("/some/path/add[translate(@key, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz') = '{0}']", value.ToLower()));

答案 1 :(得分:4)

只需使用

*[translate(name(), 'APPLICATION', 'application')='application']
     /forms/action/form/@uid

当当前(初始上下文)节点具有名称的子节点,即字符串“application”的任何大写时,这会在所有情况下正确选择所需属性。

基于XSLT的验证

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>

 <xsl:template match="/">
     <xsl:value-of select=
      "*[translate(name(), 'APPLICATION', 'application')='application']
          /forms/action/form/@uid"/>
 </xsl:template>
</xsl:stylesheet>

对以下XML文档应用此转换时:

<aPPliCatioN>
 <forms>
   <action>
    <form uid="xyz"/>
   </action>
 </forms>
</aPPliCatioN>

选择了所需节点,并将其字符串值复制到输出中:

xyz

<强>解释

正确使用标准XPath函数 name() translate()

答案 2 :(得分:2)

首先我想提一下xml是区分大小写的,所以Application意味着应用程序的其他东西,看起来我应该在生成这个xml的代码中修复 但如果你无法控制它,可以试试像你的xpath这样的东西:

"Application/forms/action/form/@uid | application/forms/action/form/@uid"

| operator将组合从两个xpath返回的节点集 在这种情况下,它将是一个或另一个

答案 3 :(得分:1)

如果根元素是唯一可以改变字母大小的元素,那么你应该只做例如。

XmlDocument doc = new XmlDocument();
doc.Load("input.xml");
XmlNode nodex= oXMLDoc1.DocumentElement.SelectSingleNode("forms/action/form/@uid");

正如评论中已经建议的那样。

使用XDocument,你可以做到。

XDocument doc = XDocument.Load("input.xml");
doc.Root.Element("forms").Element("action").Element("form").SetAttributeValue("uid", "UniqueIDx");

[编辑]评论声称第一个示例路径抛出异常,这是一个完整的示例,它不会为我抛出异常并使用之前发布的相同路径:

            string xml = @"<application>
  <forms>
    <action type=""update"">
      <form uid="""" >
      </form>
    </action>
  </forms>
</application>";
            XmlDocument doc = new XmlDocument();
            doc.LoadXml(xml);
            XmlNode nodex = doc.DocumentElement.SelectSingleNode("forms/action/form/@uid");
            nodex.Value = "UniqueIDx";

            doc.Save(Console.Out);