C# Linq与XML保持关系
我有以下结构的XML文档:C# Linq与XML保持关系,c#,.net,xml,linq,linq-to-xml,C#,.net,Xml,Linq,Linq To Xml,我有以下结构的XML文档: <dipOrders> <interchangeInfo senderEdiCode="LSC58" senderEdiCodeQal="ZZ" receiverEdiCode="15274" receiverEdiCodeQal="ZZ" syntax="X12" syntaxId="X" syntaxVersion="003010"/> <order orderNumber="219299" orderDate="20
<dipOrders>
<interchangeInfo senderEdiCode="LSC58" senderEdiCodeQal="ZZ" receiverEdiCode="15274" receiverEdiCodeQal="ZZ" syntax="X12" syntaxId="X" syntaxVersion="003010"/>
<order orderNumber="219299" orderDate="2012-12-05T00:00:00" validityDate="2012-12-05T00:00:00">
<buyer name="LEAR MTO">
<partyCode buyerCode="811567924"/>
</buyer>
<supplier name="BRIDGE OF WEIR LEATHER CO">
<partyCode buyerCode="749630"/>
</supplier>
<orderConsignee name="LEAR MEXICAN SEATING CORP">
<partyCode buyerCode="LSC59"/>
<orderLine description="LEA DC 378 HERO 6RSB 5B8" orderNumber="246767" engineeringChangeNumber="N">
<partyCode buyerCode="DC378105H6RSB5B8AA"/>
<cumulativeQuantity date="2012-12-04T00:00:00" quantity="0"/>
<orderQuantity quantity="0" commitmentLevel="Firm" timingQualifier="Weekly" shipDate="2012-12-05T00:00:00"/>
</orderLine>
<orderLine description="LEA DC 378 HERO 6RSB 5V0" orderNumber="246767" engineeringChangeNumber="N">
<partyCode buyerCode="DC378105H6RSB5V0AA"/>
<cumulativeQuantity date="2012-12-04T00:00:00" quantity="0"/>
<orderQuantity quantity="0" commitmentLevel="Firm" timingQualifier="Weekly" shipDate="2012-12-05T00:00:00"/>
<orderQuantity quantity="600" commitmentLevel="Firm" timingQualifier="Weekly" shipDate="2012-12-06T00:00:00"/>
</orderLine>
这是我访问订单行项目属性的方式:
List<int> orderNumbers = doc.Descendants("orderLine").Select(x => int)x.Attribute("orderNumber")).ToList();
List<string> descriptions = doc.Descendants("orderLine").Select(x => (string)x.Attribute("description")).ToList();
List<string> buyerCodes = doc.Descendants("orderLine").Select(x => (string)x.Element("partyCode").Attribute("buyerCode")).ToList();
List orderNumber=doc.substands(“orderLine”).Select(x=>int)x.Attribute(“orderNumber”).ToList();
列表描述=doc.substands(“orderLine”)。选择(x=>(字符串)x.Attribute(“描述”)).ToList();
列出buyerCodes=doc.substands(“orderLine”).Select(x=>(string)x.Element(“partyCode”).Attribute(“buyerCode”).ToList();
但是,orderLine可以有不同数量的orderQuantity节点。如何在Linq语句中处理它,以获得orderLine和orderQuantity之间的适当关系?尝试使用
SelectMany
,如下一个示例所示
var r = doc.Descendants("orderLine")
.SelectMany(node => node.Elements("orderQuantity")
.Select(el => new {OrderNumber = (int)node.Attribute("orderNumber"), Quantity = (int)el.Attribute("quantity")}));
现在您有了一系列匿名对象,指示订单号和相应数量,如:
246767 0
246767 600
您可以使用以下命令获取orderQuantity元素
var data = doc.Descendants("orderLine").
Descendants("orderQuantity")
.Select(x => new {paernt = x.Parent, x}).ToList();
你也这样做吗
var data = doc.Descendants("orderLine").
Descendants("orderQuantity")
.Select(x => new {OrderNumber= (int) x.Parent.Attribute("orderNumber"),
x}).ToList();
但通过这种方式,我得到了所有的“数量”,而不知道它们属于哪个订单行to@Bartosz-上述更新将为您提供子元素和父元素,即orderline和OrderQuantity…但这将为我提供一般数据对象,我现在如何通过它来获得不同的值attributes@Bartosz-为此,我认为您需要循环或在select new中进行如下更改{paerntOrdernumber=x.Parent.Attribute(“orderNumber”),x}但是我如何保持关系,知道哪个数量属于哪个订单行