web-dev-qa-db-ja.com

LINQ-to-XMLを使用して特定のノードを選択する方法

最初の顧客ノードを選択し、以下のコードで会社名を変更できます。

しかし、ID = 2の顧客ノードを選択するにはどうすればよいですか?

    XDocument xmldoc = new XDocument(
        new XDeclaration("1.0", "utf-8", "yes"),
        new XComment("These are all the customers transfered from the database."),
        new XElement("Customers",
            new XElement("Customer",
                new XAttribute("ID", 1),
                new XElement("FullName", "Jim Tester"),
                new XElement("Title", "Developer"),
                new XElement("Company", "Apple Inc.")
                ),
            new XElement("Customer",
                new XAttribute("ID", 2),
                new XElement("FullName", "John Testly"),
                new XElement("Title", "Tester"),
                new XElement("Company", "Google")
                )
            )
        );

    XElement elementToChange = xmldoc.Element("Customers").Element("Customer").Element("Company");
    elementToChange.ReplaceWith(new XElement("Company", "new company value..."));

回答:

おかげで、記録のために、customer-with-id-2要素内の会社要素を検索し、会社要素の値のみを変更する正確な構文を次に示します。

XElement elementToChange = xmldoc.Element("Customers")
    .Elements("Customer")
    .Single(x => (int)x.Attribute("ID") == 2)
    .Element("Company");
elementToChange.ReplaceWith(
    new XElement("Company", "new company value...")
    );

メソッド構文に関する回答:

メソッドの構文でもそれを理解しました:

XElement elementToChange = (from c in xmldoc.Element("Customers")
                                .Elements("Customer")
                            where (int)c.Attribute("ID") == 3
                            select c).Single().Element("Company");
48
Edward Tanguay

IDが一意であると仮定します:

var result = xmldoc.Element("Customers")
                   .Elements("Customer")
                   .Single(x => (int?)x.Attribute("ID") == 2);

Firstの代わりに、FirstOrDefaultSingleOrDefaultWhere、またはSingleを使用することもできます。

46
Mehrdad Afshari

私は次のようなものを使用します:

dim customer = (from c in xmldoc...<Customer> 
                where c.<ID>.Value=22 
                select c).SingleOrDefault 

編集:

c#タグを逃した、申し訳ありません......例はVB.NETにあります

4
Nick