1

私はC#と.NET2.0を使用しています。

以下のXMLを前提として、が「admin」でXMLNodeListある<user>ノードのを取得したいと思います。<role>

<users>
    <user>
        <name>John Doe</name>
        <roles>
            <role>superadmin</role>
            <role>admin</role>
        </roles>
    </user>
    <user>
        <name>Jane Doe</name>
        <roles>
            <role>superadmin</role>
            <role>admin</role>
        </roles>
    </user>
    <user>
        <name>Rob Doe</name>
        <roles>
            <role>support</role>
        </roles>
    </user>
 </users>

roleName="admin"と仮定します。これは機能しますが、大文字と小文字が区別されます。

userNodesForRole = _document.SelectNodes("//users/user[roles[role='" + roleName + "']]");

大文字と小文字を区別しない方法でそれを実行したいと思います。matches.NET 2.0(およびそれ以上?)はXPath 2.0をサポートしていないため、この関数を使用できないことはわかっています。だから私はこれをしました:

// abc...xyz is the string literal of the entire alphabet, of course
userNodesForRole = _document.SelectNodes("//users/user[roles[translate(role,'abc..xyz','ABC...XYZ')='" + roleName.ToUpper() + "']]", _xmlNamespaceManager);

ただし、ノードを取り戻すことはできません。誰かが私が間違っていることを教えてもらえますか?

4

1 に答える 1

1

_document.SelectNodes( "// users / user [roles [translate(role、'abc..xyz'、'ABC ... XYZ')='" + roleName.ToUpper()+ "']]"、_xmlNamespaceManager) ;

これにより、次のようなXPath式が評価されます。

  //users/user
           [roles
             [translate(role,
                        'abcdefghijklmnopqrstuvxyz',
                        'ABCDEFGHIJKLMNOPQRSTUVXYZ'
                        )
             =
              'ADMIN'
              ]
           ]

提供されたXMLドキュメントで評価した場合の上記のXPath式

<users>
    <user>
        <name>John Doe</name>
        <roles>
            <role>admin</role>
        </roles>
    </user>
    <user>
        <name>Jane Doe</name>
        <roles>
            <role>admin</role>
        </roles>
    </user>
    <user>
        <name>Rob Doe</name>
        <roles>
            <role>support</role>
        </roles>
    </user>
 </users>

次のノードを選択します。

<user>
    <name>John Doe</name>
    <roles>
        <role>admin</role>
    </roles>
</user>

<user>
    <name>Jane Doe</name>
    <roles>
        <role>admin</role>
    </roles>
</user>

roles複数のrole子を持つ要素があり、その要素がその親<role>admin</role>の最初の子ではない場合、XPath式は必要な要素を選択しません。role

この場合でも目的の要素を選択するXPath式は次のとおりです。

  //users/user
           [roles/role
             [translate(.,
                        'abcdefghijklmnopqrstuvxyz',
                        'ABCDEFGHIJKLMNOPQRSTUVXYZ'
                        )
             =
              'ADMIN'
              ]
           ]

最初の式で例外が発生したり、必要なノードが選択されなかったりする理由はさまざまです。正確な理由を見つけるには、作成されたXPath式を印刷して、ここに入力してください。

更新:@ckは実際のXMLドキュメントを提供しました。実際、実際のXMLドキュメントでは、role子(<role>admin</role> 要素)roleは親の最初の子ではありません。

だから私の推測と説明正しかった。

于 2010-08-19T03:00:48.097 に答える