我有一个函数,它以加载的形式返回XmlDocument,而我无法访问源代码。我需要做的是热衷于:
a=text.ToLowerInvariant();
xmlDoc.Load(a);
但反过来
xmlDoc.Load(text);
var workingDocument=xmlDoc.ToLower();//ToLower(this XmlNode) is the function I need
据我所知,ToLowerInvariant还会将属性值转换为较低的,以及xml节点内的文本,这是预期的行为。
有没有办法在不必递归遍历xmlDoc中的所有节点和属性的情况下完成此任务?
答案 0 :(得分:2)
如果你真的想要它,你可以随时做:
XmlDocument doc = new XmlDocument();
doc.LoadXml(xmlDoc.OuterXml.ToLower());
答案 1 :(得分:1)
如果只是你担心的XPath表达式的易读性,你可以稍微抽象一下:
var keyword = "A Keyword";
var nodes1 = xmlDoc.SelectNodes(String.Format("//foo[{0}]", XPathValueContains(keyword)));
var nodes2 = xmlDoc.SelectNodes(String.Format("//foo[{0}]", XPathValueEquals(keyword)));
其中XPathValueContains()
和XPathValueEquals()
是:
public static string XPathValueContains(string input)
{
return String.Format(
"contains(translate(., {0}, {1}), {1})",
XPathEscapeString( input.ToUpperInvariant() ),
XPathEscapeString( input.ToLowerInvariant() )
);
}
public static string XPathValueEquals(string input)
{
return String.Format(
"translate(., {0}, {1}) = {1}",
XPathEscapeString( input.ToUpperInvariant() ),
XPathEscapeString( input.ToLowerInvariant() )
);
}
和XPathEscapeString()
一个处理嵌入式单引号的函数,定义为:
public static string XPathEscapeString(string input)
{
if (input.Contains("'"))
{
return "concat('" + String.Join("', \"'\", '", input.Split('\'')) + "')";
}
else
{
return "'" + input + "'";
}
}