2011-07-11 20 views
1

XPathSelectElementを使用しようとすると大文字と小文字を無視する方法はありますか、またはXDocumentから属性を取得するような操作はありますか?この質問をする目的は、いくつかの設定ファイル(xml)があり、XPathSelectElementの必要な情報を取得するために設定ファイルを読み込むジェネリックコードを書いています。また、私は属性の値を取得しようとします。誰かがノード/属性を別のケースに入れても、私のプログラムは確実に動作するはずです。XPathSelectElementは大文字小文字を無視できますか?

C#/ .Net 3.5を使用しています。

+1

要素および属性名の適切な大文字と小文字を定義するドキュメントのXMLスキーマを記述することを検討してください。次に、入ってくるドキュメントをスキーマに対して検証し、無効なドキュメントを拒否します。これがXMLの仕組みです。大文字と小文字を区別するXMLの世界で名前の大文字小文字を無視することは、あなたが目指すべきものではありません。 –

+0

お返事ありがとうございました。 C#でこのアプローチを示すリンクを教えてください。 –

答えて

1

XPathで大文字小文字を無視することはできません。あなたは、しかし、収容することができます。例えば

- それらがASCIIの範囲の文字のみを含むと仮定要素:

 
//*[ 
    translate(
    name(), 
    'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 
    'abcdefghijklmnopqrstuvwxyz' 
) = 'myname' 
] 

属性が(*の代わりに@*と)同じように機能するであろう。

あなたはこれであなたのXPath式を膨らませたくない場合は、すべて、エレメントケース-下げる可能性があり、XSLTを経由して、たとえば、事前に属性名:あなたはXML文字列を低くするロードする前に

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
> 
    <xsl:variable name="upper" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'" /> 
    <xsl:variable name="lower" select="'abcdefghijklmnopqrstuvwxyz'" /> 

    <xsl:template match="node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="node() | @*" /> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="*"> 
    <xsl:element name="{translate(name(), $upper, $lower)}"> 
     <xsl:apply-templates select="node() | @*" /> 
    </xsl:element> 
    </xsl:template> 

    <xsl:template match="@*"> 
    <xsl:attribute name="{translate(name(), $upper, $lower)}"> 
     <xsl:value-of select="." /> 
    </xsl:attribute> 
    </xsl:template> 
</xsl:stylesheet> 
+0

コードで使用する方法を示すサンプルコードがありますか? –

+0

いいえ、これはかなり基本的なものであり、あなた自身でこれを理解できるはずです。 – Tomalak

0

-場合。それが問題を解決します。私はこの方法を自分で使います。

関連する問題