首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C# XML对XDocument的复杂查询

C# XML对XDocument的复杂查询
EN

Stack Overflow用户
提问于 2016-02-12 16:22:59
回答 1查看 298关注 0票数 2

我有一个从‘选择新’语句的复杂集合。我一直试图把它输出到一个新的'XDocument‘,但我不能。谢谢你在这方面的帮助。

来源样本:

代码语言:javascript
复制
<GetAssetWarrantyResponse>
  <GetAssetWarrantyResult>
    <Faults />
    <Response>
      <DellAsset>
        <AssetParts nil="true" />
        <CountryLookupCode>11</CountryLookupCode>
        <CustomerNumber>100540040</CustomerNumber>
        <IsDuplicate>false</IsDuplicate>
        <ItemClassCode>UI002</ItemClassCode>
        <LocalChannel>05</LocalChannel>
        <MachineDescription>OPTI 3020,TIGRISSFFFBTX</MachineDescription>
        <OrderNumber>584290163</OrderNumber>
        <ParentServiceTag nil="true" />
        <ServiceTag>1CZTF02</ServiceTag>
        <ShipDate>2014-03-21T00:00:00</ShipDate>
        <Warranties>
          <Warranty>
            <EndDate>2022-03-21T23:59:59</EndDate>
            <EntitlementType>INITIAL</EntitlementType>
            <ItemNumber>422-0052</ItemNumber>
            <ServiceLevelCode>D</ServiceLevelCode>
            <ServiceLevelDescription>DirectLine Service</ServiceLevelDescription>
            <ServiceLevelGroup>11</ServiceLevelGroup>
            <ServiceProvider>DELL</ServiceProvider>
            <StartDate>2014-03-21T00:00:00</StartDate>
          </Warranty>
          <Warranty>
            <EndDate>2017-03-21T23:59:59</EndDate>
            <EntitlementType>INITIAL</EntitlementType>
            <ItemNumber>984-0092</ItemNumber>
            <ServiceLevelCode>KK</ServiceLevelCode>
            <ServiceLevelDescription>Keep Your Hard Drive Service</ServiceLevelDescription>
            <ServiceLevelGroup>11</ServiceLevelGroup>
            <ServiceProvider>DELL</ServiceProvider>
            <StartDate>2014-03-21T00:00:00</StartDate>
          </Warranty>
          <Warranty>
            <EndDate>2017-03-21T23:59:59</EndDate>
            <EntitlementType>EXTENDED</EntitlementType>
            <ItemNumber>939-7358</ItemNumber>
            <ServiceLevelCode>ND</ServiceLevelCode>
            <ServiceLevelDescription>Next Business Day Support</ServiceLevelDescription>
            <ServiceLevelGroup>5</ServiceLevelGroup>
            <ServiceProvider>UNY</ServiceProvider>
            <StartDate>2015-03-22T00:00:00</StartDate>
          </Warranty>
          <Warranty>
            <EndDate>2015-03-21T23:59:59</EndDate>
            <EntitlementType>INITIAL</EntitlementType>
            <ItemNumber>939-6868</ItemNumber>
            <ServiceLevelCode>ND</ServiceLevelCode>
            <ServiceLevelDescription>Next Business Day Support</ServiceLevelDescription>
            <ServiceLevelGroup>5</ServiceLevelGroup>
            <ServiceProvider>UNY</ServiceProvider>
            <StartDate>2014-03-21T00:00:00</StartDate>
          </Warranty>
          <Warranty>
            <EndDate>2022-03-24T23:59:59</EndDate>
            <EntitlementType>INITIAL</EntitlementType>
            <ItemNumber>421-9982</ItemNumber>
            <ServiceLevelCode>D</ServiceLevelCode>
            <ServiceLevelDescription>DirectLine Service</ServiceLevelDescription>
            <ServiceLevelGroup>11</ServiceLevelGroup>
            <ServiceProvider>DELL</ServiceProvider>
            <StartDate>2014-03-21T00:00:00</StartDate>
          </Warranty>
          <Warranty>
            <EndDate>2022-03-24T23:59:59</EndDate>
            <EntitlementType>INITIAL</EntitlementType>
            <ItemNumber>525-0013</ItemNumber>
            <ServiceLevelCode>D</ServiceLevelCode>
            <ServiceLevelDescription>DirectLine Service</ServiceLevelDescription>
            <ServiceLevelGroup>11</ServiceLevelGroup>
            <ServiceProvider>DELL</ServiceProvider>
            <StartDate>2014-03-21T00:00:00</StartDate>
          </Warranty>
          <Warranty>
            <EndDate>2022-03-24T23:59:59</EndDate>
            <EntitlementType>INITIAL</EntitlementType>
            <ItemNumber>422-0008</ItemNumber>
            <ServiceLevelCode>D</ServiceLevelCode>
            <ServiceLevelDescription>DirectLine Service</ServiceLevelDescription>
            <ServiceLevelGroup>11</ServiceLevelGroup>
            <ServiceProvider>DELL</ServiceProvider>
            <StartDate>2014-03-21T00:00:00</StartDate>
          </Warranty>
        </Warranties>
      </DellAsset>
      <DellAsset>
        <AssetParts nil="true" />
        <CountryLookupCode>11</CountryLookupCode>
        <CustomerNumber>100540040</CustomerNumber>
        <IsDuplicate>false</IsDuplicate>
        <ItemClassCode>7M002</ItemClassCode>
        <LocalChannel>05</LocalChannel>
        <MachineDescription>POWEREDGE R720XD, ORCA S PE</MachineDescription>
        <OrderNumber>339791846</OrderNumber>
        <ParentServiceTag nil="true" />
        <ServiceTag>1VF0TW1</ServiceTag>
        <ShipDate>2013-03-20T00:00:00</ShipDate>
        <Warranties>
          <Warranty>
            <EndDate>2016-03-20T23:59:59</EndDate>
            <EntitlementType>INITIAL</EntitlementType>
            <ItemNumber>936-7263</ItemNumber>
            <ServiceLevelCode>SV</ServiceLevelCode>
            <ServiceLevelDescription>Silver Premium Support</ServiceLevelDescription>
            <ServiceLevelGroup>8</ServiceLevelGroup>
            <ServiceProvider>DELL</ServiceProvider>
            <StartDate>2013-03-20T00:00:00</StartDate>
          </Warranty>
          <Warranty>
            <EndDate>2016-03-20T23:59:59</EndDate>
            <EntitlementType>INITIAL</EntitlementType>
            <ItemNumber>983-6402</ItemNumber>
            <ServiceLevelCode>KK</ServiceLevelCode>
            <ServiceLevelDescription>Keep Your Hard Drive Service</ServiceLevelDescription>
            <ServiceLevelGroup>11</ServiceLevelGroup>
            <ServiceProvider>DELL</ServiceProvider>
            <StartDate>2013-03-20T00:00:00</StartDate>
          </Warranty>
          <Warranty>
            <EndDate>2016-03-20T23:59:59</EndDate>
            <EntitlementType>EXTENDED</EntitlementType>
            <ItemNumber>936-7243</ItemNumber>
            <ServiceLevelCode>ND</ServiceLevelCode>
            <ServiceLevelDescription>Next Business Day Support</ServiceLevelDescription>
            <ServiceLevelGroup>5</ServiceLevelGroup>
            <ServiceProvider>UNY</ServiceProvider>
            <StartDate>2014-03-21T00:00:00</StartDate>
          </Warranty>
          <Warranty>
            <EndDate>2014-03-20T23:59:59</EndDate>
            <EntitlementType>INITIAL</EntitlementType>
            <ItemNumber>989-2701</ItemNumber>
            <ServiceLevelCode>ND</ServiceLevelCode>
            <ServiceLevelDescription>Next Business Day Support</ServiceLevelDescription>
            <ServiceLevelGroup>5</ServiceLevelGroup>
            <ServiceProvider>UNY</ServiceProvider>
            <StartDate>2013-03-20T00:00:00</StartDate>
          </Warranty>
        </Warranties>
      </DellAsset>
      </Response>
    </GetAssetWarrantyResult>
</GetAssetWarrantyResponse>

以下是我到目前为止所拥有的:

代码语言:javascript
复制
    var xlQueryTest = (from mainRequest in testing.Descendants("Response")
                  select new
                  {
                      Baseinfo = (from baseInfo in mainRequest.Descendants("DellAsset")
                                  select new
                                  {
                                      MachineName = baseInfo.Element("MachineDescription").Value,
                                      ServiceTag = baseInfo.Element("ServiceTag").Value,
                                      WarrantyStart = baseInfo.Element("ShipDate").Value,
                                      Warranties = (from warranty in baseInfo.Descendants("Warranties")
                                                    select new
                                                    {
                                                        Service = (string)warranty.Element("ServiceLevelDescription").Value,
                                                        Provider = (string)warranty.Element("ServiceProvider").Value,
                                                        StartDate = (string)warranty.Element("StartDate").Value,
                                                        EndDate = (string)warranty.Element("EndDate").Value,
                                                        TypeOfWarranty = (string)warranty.Element("EntitlementType").Value
                                                    }).GroupBy(x => x.Service)
                                  }).AsEnumerable().ToList()
                  });

var newDocument = new XDocument(new XElement("Request",
    xlQueryTest.Select(a => a.Baseinfo).Select( 
        //HOWTO
        //iterate through "BaseInfo" Elements
        //iterate through "Warranties" Collection 

我在访问收藏品时遇到了困难

我想要达到的结果是:

代码语言:javascript
复制
<Request>
    <BaseInfo>
        <MachineName>a</MachineName>
        <ServiceTag>a12345</ServiceTag>
        <ShipDate>01/01/2000</ShipDate>
            <Warranties>
                <Warranty>
                    <ServiceLevelDescription>dfdlkfj</ServiceLevelDescription>
                    <ServiceProvider>ABC</ServiceProvider>
                    <StartDate>01/01/2001</StartDate>
                    <EndDate>01/05/2007</EndDate>
                </Warranty>
                <Warranty>
                </Warranty>
            </Warranties>
    </BaseInfo>
    <BaseInfo>
        <MachineName>b</MachineName>
        <ServiceTag>b12345</ServiceTag>
        <ShipDate>01/01/2010</ShipDate>
            <Warranties>
                <Warranty>
                    <ServiceLevelDescription>dfdlkfj</ServiceLevelDescription>
                    <ServiceProvider>ABCF</ServiceProvider>
                    <StartDate>01/01/2011</StartDate>
                    <EndDate>01/05/2017</EndDate>
                </Warranty>
                <Warranty>
                </Warranty>
            </Warranties>
    </BaseInfo>
</Request>

更新:,我把它放在一起,试图进一步解释我要做什么。

如何将其转换为“新XDocument”以获得所需的结果(上面)

代码语言:javascript
复制
foreach(var request in xlQueryTest)
            {
                //<Request>

                foreach(var machine in request.Baseinfo)
                {
                    //<BaseInfo>
                        //<MachineName>machine.MachineName</MachineName>
                        //<ServiceTag>machine.ServiceTag</ServiceTag>
                        //<ShipDate>machine.WarrantyStart</ShipDate>
                        //  <Warranites>
                        foreach(var warranty in machine.Warranties)
                        {
                            //<Warranty>
                                //<ServiceLevelDescription>warranty.Service</ServiceLevelDescription>
                                //<ServiceProvider>warranty.Provier</ServiceProvider>
                                //<StartDate>warranty.StartDate</StartDate>
                                //<EndDate>warranty.EndDate</EndDate>
                            //</Warranty>
                        }
                        //  </Warranties>
                    }
                    //</BaseInfo>
                }
                //</Request>
            }

答案:,我使用har07的答案,因为它解决了重复的问题。Jdweng的解决方案是优雅的,但不纠正重复的信息。

代码语言:javascript
复制
var xlQueryTest = (from mainRequest in testing.Descendants("Response")
                               select new
                               {
                                   Baseinfo = (from baseInfo in mainRequest.Descendants("DellAsset")
                                               select new
                                               {
                                                   MachineName = baseInfo.Element("MachineDescription").Value,
                                                   ServiceTag = baseInfo.Element("ServiceTag").Value,
                                                   WarrantyStart = baseInfo.Element("ShipDate").Value,
                                                   Warranties = (from warranty in baseInfo.Descendants("Warranty")
                                                                 select new
                                                                 {
                                                                     Service = (string)warranty.Element("ServiceLevelDescription"),
                                                                     Provider = (string)warranty.Element("ServiceProvider"),
                                                                     StartDate = (string)warranty.Element("StartDate"),
                                                                     EndDate = (string)warranty.Element("EndDate"),
                                                                     TypeOfWarranty = (string)warranty.Element("EntitlementType")
                                                                 }).GroupBy(x => x.Service)
                                               }).AsEnumerable().ToList()
                               });
                        var newDocument =
                            new XDocument(new XElement("Request",
                            from t in xlQueryTest
                            from q in t.Baseinfo
                            select
                            new XElement("BaseInfo",
                                new XElement("MachineDescription", q.MachineName),
                                new XElement("ServiceTag", q.ServiceTag),
                                new XElement("ShipDate", q.WarrantyStart),
                                new XElement("Warranites",
                                from g in q.Warranties
                                select
                                    new XElement("Warranty",
                                    new XElement("ServiceLevelDescription", g.Key),
                                    new XElement("ServiceProvider", g.First().Provider),
                                    new XElement("StartDate", g.First().StartDate),
                                    new XElement("EndDate", g.First().EndDate)
                                )
                            )
                        )
                    ));

谢谢大家的帮助。

EN

回答 1

Stack Overflow用户

发布于 2016-02-12 17:02:45

尝尝这个

代码语言:javascript
复制
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication77
{
    class Program
    {
        const string FILENAME = @"C:\temp\test.xml";
        static void Main(string[] args)
        {
            string xml =
            "<Request>" +
            "</Request>";

            XDocument newDoc = XDocument.Parse(xml);
            XElement request = newDoc.Descendants("Request").FirstOrDefault();

            XDocument oldDoc = XDocument.Load(FILENAME);

            foreach (XElement dellAsset in oldDoc.Descendants("DellAsset"))
            {
                XElement baseInfo = new XElement("BaseInfo");
                request.Add(baseInfo);

                baseInfo.Add(dellAsset.Element("MachineDescription"));
                baseInfo.Add(dellAsset.Element("ParentServiceTag"));
                baseInfo.Add(dellAsset.Element("ShipDate"));

                XElement warranties = new XElement("Warranties");
                baseInfo.Add(warranties);
                XElement latestWarranty = dellAsset.Descendants("Warranty")
                    .OrderBy(x => (DateTime)x.Element("EndDate")).LastOrDefault();

                warranties.Add( new XElement("Warranty", new XElement[] {
                              latestWarranty.Element("ServiceLevelDescription"),
                              latestWarranty.Element("ServiceProvider"),
                              latestWarranty.Element("StartDate"),
                              latestWarranty.Element("EndDate"),
                              latestWarranty.Element("EntitlementType")
                }));

            }

        }
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35367430

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档