选择具有 XPath 的节点,忽略节点名称中的大小写
本文关键字:节点 大小写 XPath 选择 | 更新日期: 2023-09-27 18:37:22
>我有一个类似于XPath忽略案例的SelectNodes问题,但在我的情况下,大写/小写问题出在名为"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
我们可以将 xml 和我们的变量转换为小写。
string value = "aBc";
XmlNode xmlnode = xmldoc.SelectSingleNode(string.Format("/some/path/add[translate(@key, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz') = '{0}']", value.ToLower()));
只需使用:
*[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()
。
首先,
我想提一下xml区分大小写,因此应用程序意味着其他东西,然后应用程序,在我看来,这应该在生成此xml的代码中修复但是,如果您无法控制它,请尝试以下方法作为您的 XPath:
"Application/forms/action/form/@uid | application/forms/action/form/@uid"
| 运算符将组合从两个 xpath 返回的节点集在这种情况下,它将是一个或另一个
如果根元素是唯一可以改变字母大小写的元素,那么你应该简单地做,
例如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);
我发现最简单的方法是将 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']");