4

我有一个类似于SelectNodes with XPath ignoring case的问题,但在我的情况下,大写/小写问题出现在名称为“应用程序”的节点中(有时是“应用程序”,有时是“应用程序”)。

我将如何应用其他帖子的解决方案?还是在这种情况下适用不同的?

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

5 回答 5

6

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

string value = "aBc";
XmlNode xmlnode = xmldoc.SelectSingleNode(string.Format("/some/path/add[translate(@key, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz') = '{0}']", value.ToLower()));
于 2015-06-18T14:59:13.937 回答
5

只需使用

*[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().

于 2012-06-15T12:05:31.610 回答
2

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

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

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

于 2012-06-15T10:17:19.173 回答
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);
于 2012-06-15T11:11:26.203 回答
0

我发现最简单的方法是将 XML 文件加载为全部小写,然后确保所有后续 XPath 表达式全部为小写。

例子:

var xmlDoc = new System.Xml.XmlDocument();
var rawFile = System.IO.File.ReadAllText(@"\Path\To\File.xml");
xmlDoc.LoadXml(rawFile.ToLower());

XmlNode node = xmlDoc.SelectSingleNode("//some/path[@attribute1='somevalue' and @attribute2='anothervalue']");
于 2021-08-17T22:12:28.883 回答