2012-03-16 61 views
2

我有一個函數,它以加載的形式返回XmlDocument,並且我沒有訪問源。我需要做的是什麼一個熱衷於:將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

* *爲什麼你要這麼做? – Tomalak 2012-03-16 06:27:46

+0

我想在文檔內容上運行不區分大小寫的xpath查詢,而不必一直使用翻譯功能 – 2012-03-16 06:31:08

+0

我一直這麼想。你是否有一個實際的性能瓶頸? – Tomalak 2012-03-16 06:36:44

回答

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

如果你真的真的想要它,你總是可以做:

XmlDocument doc = new XmlDocument(); 
doc.LoadXml(xmlDoc.OuterXml.ToLower()); 
+0

hehe)))。邪惡) – 2012-03-16 19:42:22

相關問題