0

この XML を使用して、「Tech」に一致するノードからノードを取得したいと考えXmlNodeListてい<member>ます<group><id>一致は大文字と小文字を区別しない必要があります。

   <groups>
        <group>
            <id>Tech</id>
            <members>
                <member>johndoe</member>
                <member>janedoe</member>
                <member>robdoe</member>
            </members>
        </group>
        <group>
            <id>Support</id>
            <members>
                <member>johnfoe</member>
                <member>janefoe</member>
                <member>robfoe</member>
            </members>
        </group>
    </groups>

「doeメンバー」を取得することを期待してこれを試しましたが、結果が返されないようです。

     // assume groupName='tech'
    _document.SelectNodes("//groups/group[translate(id,'abcdefghijklmnopqrstuvxyz','ABCDEFGHIJKLMNOPQRSTUVXYZ')='" + groupName.ToUpper() + "']/members/member");
4

2 に答える 2

0

繰り返しになりますが、おそらくあなたのXMLドキュメントはあなたが私たちに見せたものではありません。多くの場合、正しいXPath式が機能しないように見える理由は、ドキュメントにデフォルトの名前空間が定義されており、式で使用される名前にプレフィックスが付いていないためです。

このC#コンソールアプリケーション

using System;
using System.Xml;

class TestXPath
{
    static void Main(string[] args)
    {
        string xmlText =
@"<groups>
    <group>
        <id>Tech</id>
        <members>
            <member>johndoe</member>
            <member>janedoe</member>
            <member>robdoe</member>
        </members>
    </group>
    <group>
        <id>Support</id>
        <members>
            <member>johnfoe</member>
            <member>janefoe</member>
            <member>robfoe</member>
        </members>
    </group>
</groups>";

        XmlDocument doc = new XmlDocument();
        doc.LoadXml(xmlText);

        string groupName = "tech";

        string xpathExpr =
@"//groups/group
            [translate(id,'abcdefghijklmnopqrstuvwxyz','ABCDEFGHIJKLMNOPQRSTUVWXYZ')
            ='"
            + groupName.ToUpper() +@"'
            ]
             /members/member";

        XmlNodeList selection = doc.SelectNodes(xpathExpr);

        foreach (XmlNode node in selection)
        {
            Console.WriteLine(node.OuterXml);
        }

    }
}

実行すると、期待される正しい結果が生成されます

<member>johndoe</member>
<member>janedoe</member>
<member>robdoe</member>
于 2011-11-18T00:26:58.643 に答える
0

の価値はgroupNameあなたが思っているものではないと思います。

私はあなたのコードに基づいてこの例をコンパイルしました、そして私はあなたが期待しているように見える結果を得ました:

var doc = new XmlDocument();
doc.LoadXml(
@"<groups>
    <group>
        <id>Tech</id>
        <members>
            <member>johndoe</member>
            <member>janedoe</member>
            <member>robdoe</member>
        </members>
    </group>
    <group>
        <id>Support</id>
        <members>
            <member>johnfoe</member>
            <member>janefoe</member>
            <member>robfoe</member>
        </members>
    </group>
</groups>");
foreach (XmlElement node in doc.SelectNodes("//groups/group[translate(id,'abcdefghijklmnopqrstuvxyz','ABCDEFGHIJKLMNOPQRSTUVXYZ')='" + "tech".ToUpper() + "']/members/member"))
    Console.WriteLine(node.InnerText);

johndoejanedoerobdoe
続行するには任意のキーを押してください

。。

私の他の推測(私にとってはうまくいくように見えるので、暗闇の中で突き刺します!)は、現在の言語で問題が発生している(翻訳を使用していますか?)か、ロードしているXMLドキュメントが何らかの理由で壊れている(バイト順)マーク?)。基本的に、キャラクターストリームの問題。

于 2010-08-20T03:38:19.697 に答える