0

LINQ テクノロジを使用して xml ファイルを検索したいのですが、いくつか問題があります。属性値といくつかの検索条件ですべての子を検索したい

私の XML (構造化データ) は次のようになります。

<?xml version="1.0" encoding="utf-8" standalone="yes"?> 
<LanguageMenu>
    <Menu language="English" name ="Menu" numOfMenus="1">
        <MainItem ID="e_mnuMain1" name="File" level="0"></MainItem>
        <MainItem ID="e_mnuMain2" name="Edit" level="0"></MainItem>
        <MainItem ID="e_mnuMain3" name="Query" level="0"></MainItem>
        <MainItem ID="e_mnuMain4" name="Traffic" numOfSubItem="4" level="0"> 
            <SECOND name="Vendors" value="FIN3010" level="1" father="3"></SECOND>
            <SECOND name="Buyers" value="FIN3020" level="1" father="3" ></SECOND>
            <SECOND name="General ledger" value="FIN3030" level="1" father="3"></SECOND>
            <SECOND name="Accounts" value="FIN3040" level="1" father="3">
                <THIRD name="Home Accounts" value="FIN3010" level="2" father="5" grantfather="3"/>
                <THIRD name="Foreign accounts" value="FIN3050" level="2" father="5" grantfather="3"/>
            </SECOND>
        </MainItem>
    </Menu>
</LanguageMenu>

LINQ を使用して、値 FIN3010 を持つ Element MainItem で始まるすべての子を見つけたいと考えています。XML に基づいて、Vendors と Home Accounts を返す必要があります。

その子の親も取得したいので、達成したい出力は次のようになります。

Traffic - Vendors
Traffic - Accounts - Home Accounts

私はこのコードにこだわっています:

XElement xelement = XElement.Load("../../xmlFile");
var x = from a in xelement.Descendants("SECONDS")
        where a.Attribute("value") != null 
        && (string)a.Attribute("value").Value.ToUpper() == txtSifra.Text.ToUpper()
        select a;
foreach (XElement xEle in x)
{
    //TODO
}
4

1 に答える 1

0

これはどう:

var x = from a in xelement.Descendants("MainItem")
                          .Descendants()
        where a.Attribute("value") != null && 
              a.Attribute("value").Value
                                  .Equals(txtSifra.Text, 
                                          StringComparison.InvariantCultureIgnoreCase)
        select a;
foreach (XElement xEle in x)
{
        // items will contain all nodes (inclusive) between MainItem and xEle
        var items = xEle.AncestorsAndSelf()
                        .Where(x1 => x1.AncestorsAndSelf("MainItem")
                                       .Any())
                        .OrderBy(x1 => x1.Ancestors().Count());
        var names = items.Attributes("name").Select(a => a.Value).ToArray();
        Console.WriteLine(string.Join(" - ", names));
}

これからの出力は次のとおりです。

Traffic - Vendors
Traffic - Accounts - Home Accounts
于 2013-03-20T14:27:05.100 に答える