1

子孫に基づいてトランザクションのリストを取得したい。しかし、linq 構文を正しくするのに問題があります。私のデータは次のようになります。

<Data>
    <MyTransactionXML>
           <contract>
                <contractID>1234</contractID>
                <ProductCode>ABC</ProductCode>
           </contract>
           ...
    </MyTransactionXML>
    <MyTransactionXML>
            <contract>
                <contractID>13334</contractID>
                <ProductCode>DEF</ProductCode>
           </contract>
           ...
    </MyTransactionXML>
</Data>

私は次のようなことを考えていましたが、うまくいきませんでした:

xdoc.Root.Descendants("MyTransactionXML")
         .Where(y => y.Descendants("ProductCode")
                      .Where(z => z.Value == "NY.E.ENG.JE.SVC.RF.VAR2.UP") == true);

MyTransactionXML.contract.ProductCode であることをハード コードしたくありません。場所が変わったり、製品コードが異なる構造の類似のトランザクションを使用したりした場合でも、トランザクションを取得できるようにしたいからです。

4

1 に答える 1

1

述語はブール値を返す必要があるため、製品コードでトランザクションをフィルタリングする場合はAny()代わりに使用する必要がありますWhere()

from t in xdoc.Descendants("MyTransactionXML")
where t.Descendants("ProductCode").Any(c => (string)c == "DEF") // here
select t

ラムダ構文と同じ:

xdoc.Descendants("MyTransactionXML")
     .Where(t => t.Descendants("ProductCode").Any(c => (string)c == "DEF"))

または、XPath 拡張機能を使用できます

xdoc.XPathSelectElements("//MyTransactionXML[*/ProductCode='DEF']");

*ワイルドカードは任意のノードに一致するため、xml 構造の変更を処理します

于 2013-06-10T13:54:16.727 に答える