将XmlDocument中的所有文本转换为小写

时间:2012-03-16 06:26:46

标签: c# xml xmldocument xls

我有一个函数,它以加载的形式返回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中的所有节点和属性的情况下完成此任务?

2 个答案:

答案 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 + "'";
    }
}