İki koleksiyonu birleştirme (LINQ to XML)

XSD dosyası, yeni öğe türleri oluşturmak üzere öğelerin birleştirilebilmesi için XML dosyasında ilişkiler kurabilir. Bu makalede, öğeleri birleştiren ve yeni bir XML belgesi oluşturan C# ve Visual Basic için bir örnek sağlanır.

XML belgesindeki bir öğe veya öznitelik bazen başka bir öğeye veya özniteliğe başvurabilir. Örneğin, XML belgesi Örnek XML dosyası: Müşteriler ve siparişler bir müşteri listesi ve bir sipariş listesi içerir. Her Customer öğenin bir CustomerID özniteliği vardır ve her Order öğe bir CustomerID öğe içerir. CustomerID Bir Order öğedeki öğe değeri, eşleşen CustomerID öznitelik değerine sahip öğeye Customer başvurur.

Örnek XSD dosyası: Müşteriler ve siparişler makalesi, belgeyi Customers and orders doğrulamak için kullanılabilecek bir XSD içerir. öğesinin xs:key özniteliğinin Customer bir anahtar olduğunu CustomerID ve anahtar ile öğelerin öğesi arasında bir ilişki kurmak için XSD'nin Orderve xs:keyrefCustomerID özelliklerini kullanır.

LINQ to XML ile, sipariş bilgileri için müşteri bilgilerini birleştirmek üzere yan tümcesini join kullanarak bu ilişkiden yararlanabilirsiniz.

hakkında joindaha ayrıntılı bilgi için bkz . Birleştirme İşlemleri (C#) ve Birleştirme İşlemleri (Visual Basic).

Not

Birleştirmeler doğrusal aramalar kullanılarak yapılır. Arama performansını artıracak dizin yok.

Örnek: ve Order öğelerinin Customer katıldığı yeni bir XML belgesi oluşturma

Aşağıdaki örnek, Örnek XML dosyasının öğelerini birleştiren Customer yeni bir XML belgesi oluşturur: Müşteriler ve siparişler öğelere Order eklenir ve öğesini siparişlere eklerCompanyName.

Sorguyu yürütmeden önce örnek, belgenin Örnek XSD dosyasındaki şemayla uyumlu olduğunu doğrular: Müşteriler ve siparişler. Bu, join yan tümcesinin çalışmasını sağlar.

Sorgu yalnızca "K" değerinden büyük müşteriler CustomerID için siparişleri seçer. Her sipariş içindeki müşteri bilgilerini içeren yeni Order öğeleri projeler.

XmlSchemaSet schemas = new XmlSchemaSet();
schemas.Add("", "CustomersOrders.xsd");

Console.Write("Attempting to validate, ");
XDocument custOrdDoc = XDocument.Load("CustomersOrders.xml");

bool errors = false;
custOrdDoc.Validate(schemas, (o, e) =>
                     {
                         Console.WriteLine("{0}", e.Message);
                         errors = true;
                     });
Console.WriteLine("custOrdDoc {0}", errors ? "did not validate" : "validated");

if (!errors)
{
    // Join customers and orders, and create a new XML document with
    // a different shape.

    // The new document contains orders only for customers with a
    // CustomerID > 'K'
    XElement custOrd = custOrdDoc.Element("Root");
    XElement newCustOrd = new XElement("Root",
        from c in custOrd.Element("Customers").Elements("Customer")
        join o in custOrd.Element("Orders").Elements("Order")
                   on (string)c.Attribute("CustomerID") equals
                      (string)o.Element("CustomerID")
        where ((string)c.Attribute("CustomerID")).CompareTo("K") > 0
        select new XElement("Order",
            new XElement("CustomerID", (string)c.Attribute("CustomerID")),
            new XElement("CompanyName", (string)c.Element("CompanyName")),
            new XElement("ContactName", (string)c.Element("ContactName")),
            new XElement("EmployeeID", (string)o.Element("EmployeeID")),
            new XElement("OrderDate", (DateTime)o.Element("OrderDate"))
        )
    );
    Console.WriteLine(newCustOrd);
}
Public Class Program
    Public Shared errors As Boolean = False

    Public Shared Function LamValidEvent(ByVal o As Object, _
                 ByVal e As ValidationEventArgs) As Boolean
        Console.WriteLine("{0}", e.Message)
        errors = True
    End Function

    Shared Sub Main()
        Dim schemas As New XmlSchemaSet()
        schemas.Add("", "CustomersOrders.xsd")

        Console.Write("Attempting to validate, ")
        Dim custOrdDoc As XDocument = XDocument.Load("CustomersOrders.xml")

        custOrdDoc.Validate(schemas, Function(o, e) LamValidEvent(0, e))
        If errors Then
            Console.WriteLine("custOrdDoc did not validate")
        Else
            Console.WriteLine("custOrdDoc validated")
        End If

        If Not errors Then
            'Join customers and orders, and create a new XML document with
            ' a different shape.
            'The new document contains orders only for customers with a
            ' CustomerID > 'K'.
            Dim custOrd As XElement = custOrdDoc.<Root>.FirstOrDefault
            Dim newCustOrd As XElement = _
                <Root>
                    <%= From c In custOrd.<Customers>.<Customer> _
                        Join o In custOrd.<Orders>.<Order> _
                        On c.@CustomerID Equals o.<CustomerID>.Value _
                        Where c.@CustomerID.CompareTo("K") > 0 _
                        Select _
                        <Order>
                            <CustomerID><%= c.@CustomerID %></CustomerID>
                            <%= c.<CompanyName> %>
                            <%= c.<ContactName> %>
                            <%= o.<EmployeeID> %>
                            <%= o.<OrderDate> %>
                        </Order> _
                    %>
                </Root>
            Console.WriteLine(newCustOrd)
        End If
    End Sub
End Class

Bu örnek aşağıdaki çıkışı oluşturur:

Attempting to validate, custOrdDoc validated
<Root>
  <Order>
    <CustomerID>LAZYK</CustomerID>
    <CompanyName>Lazy K Kountry Store</CompanyName>
    <ContactName>John Steel</ContactName>
    <EmployeeID>1</EmployeeID>
    <OrderDate>1997-03-21T00:00:00</OrderDate>
  </Order>
  <Order>
    <CustomerID>LAZYK</CustomerID>
    <CompanyName>Lazy K Kountry Store</CompanyName>
    <ContactName>John Steel</ContactName>
    <EmployeeID>8</EmployeeID>
    <OrderDate>1997-05-22T00:00:00</OrderDate>
  </Order>
  <Order>
    <CustomerID>LETSS</CustomerID>
    <CompanyName>Let's Stop N Shop</CompanyName>
    <ContactName>Jaime Yorres</ContactName>
    <EmployeeID>1</EmployeeID>
    <OrderDate>1997-06-25T00:00:00</OrderDate>
  </Order>
  <Order>
    <CustomerID>LETSS</CustomerID>
    <CompanyName>Let's Stop N Shop</CompanyName>
    <ContactName>Jaime Yorres</ContactName>
    <EmployeeID>8</EmployeeID>
    <OrderDate>1997-10-27T00:00:00</OrderDate>
  </Order>
  <Order>
    <CustomerID>LETSS</CustomerID>
    <CompanyName>Let's Stop N Shop</CompanyName>
    <ContactName>Jaime Yorres</ContactName>
    <EmployeeID>6</EmployeeID>
    <OrderDate>1997-11-10T00:00:00</OrderDate>
  </Order>
  <Order>
    <CustomerID>LETSS</CustomerID>
    <CompanyName>Let's Stop N Shop</CompanyName>
    <ContactName>Jaime Yorres</ContactName>
    <EmployeeID>4</EmployeeID>
    <OrderDate>1998-02-12T00:00:00</OrderDate>
  </Order>
</Root>