İ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 Order
ve xs:keyref
CustomerID
ö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 join
daha 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>