2012-03-16 53 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

+0

いつもtranslate関数を使わなくても、ドキュメントの内容に大文字と小文字を区別しないxpathクエリを実行したい –

+0

私はそれほど考えませんでした。そのため実際のパフォーマンスのボトルネックはありますか? – Tomalak

答えて

1

それはあなたが心配しているXPath式のちょうど読みやすさであれば、少し離れているあなたのことができ抽象的な:

XPathValueContains()XPathValueEquals()がある
var keyword = "A Keyword"; 

var nodes1 = xmlDoc.SelectNodes(String.Format("//foo[{0}]", XPathValueContains(keyword))); 
var nodes2 = xmlDoc.SelectNodes(String.Format("//foo[{0}]", XPathValueEquals(keyword))); 

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))))。邪悪な) –

関連する問題