【问题标题】:How to make a query with multiple linked items in LINQ XML如何在 LINQ XML 中使用多个链接项进行查询
【发布时间】:2020-04-28 11:44:08
【问题描述】:

我有一个 XML 文件的这些后代:

    <LNodeType id="SIPROTEC5_LNType_MMXU_OpMeas_RMS_3ph_Pres" lnClass="MMXU">
        <DO name="PPV" type="SIPROTEC5_DOType_DEL_mag_V08.01.12_V08.00.00" />
        <DO name="PhV" type="SIPROTEC5_DOType_WYE_ABCRes_mag_V08.01.12_V08.00.00" />
        <DO name="A" type="SIPROTEC5_DOType_WYE_ABCRes_mag_V08.01.12_V08.00.00" />
    </LNodeType>


    <DOType id="SIPROTEC5_DOType_WYE_ABCRes_mag_V08.01.12_V08.00.00" cdc="WYE">
        <SDO name="phsA" type="SIPROTEC5_DOType_CMV_mag_without_convertions_V08.01.12_V08.00.00" />
        <SDO name="phsB" type="SIPROTEC5_DOType_CMV_mag_without_convertions_V08.01.12_V08.00.00" />
        <SDO name="phsC" type="SIPROTEC5_DOType_CMV_mag_without_convertions_V08.01.12_V08.00.00" />
    </DOType>


    <DOType id="SIPROTEC5_DOType_CMV_mag_without_convertions_V08.01.12_V08.00.00" cdc="CMV">
        <DA fc="MX" name="instCVal" bType="Struct" type="SIPROTEC5_DAType_Vector_mag_V08.01.12_V07.90.00" />
        <DA dchg="true" fc="MX" name="cVal" bType="Struct" type="SIPROTEC5_DAType_Vector_mag_V08.01.12_V07.90.00" />
    </DOType>



    <DAType id="SIPROTEC5_DAType_Vector_mag_V08.01.12_V07.90.00">
        <BDA name="mag" bType="Struct" type="SIPROTEC5_DAType_AnalogValue_FLOAT32_V08.01.12_V07.90.00" />
    </DAType>
    <DAType id="SIPROTEC5_DAType_AnalogValue_FLOAT32_V08.01.12_V07.90.00">
        <BDA name="f" bType="FLOAT32" valKind="Set">
            <Val>0</Val>
        </BDA>
    </DAType>

元素的每一种类型都是另一个后代的 id。我想制作一个特定孩子的扁平列表让我们说 name="A" 并且结果应该是一个列表:

A.phasA.instCval.f,
A.phasB.instCval.f,
A.phasC.instCval.f,
A.phasA.Cval.f,
A.phasB.Cval.f,
A.phasC.Cval.f

我使用了许多内部连接,但我认为这不是最好的方法。

DataSet = from dataset in datasets
select new dataset()
{
Name = (string)dataset.Attribute("name"),
Lnodes = from dataAttribute in Doc.Root.Descendants(df + "DA")
join dataObject in Doc.Root.Descendants(df + "DO")
on (string)dataAttribute.Parent.Attribute("id")
equals (string)dataObject.Attribute("type")
join doi in ied.Descendants(df + "DOI")
on new
{
lnType = (string)dataObject.Parent.Attribute("id"),
lnClass = (string)dataObject.Parent.Attribute("lnClass"),
name = (string)dataObject.Attribute("name")
}

equals new
{
lnType = (string)doi.Parent.Attribute("lnType"),
lnClass = (string)doi.Parent.Attribute("lnClass"),
name = (string)doi.Attribute("name")
}

where ((string)dataAttribute.Attribute("bType") == "BOOLEAN" ||
(string)dataAttribute.Attribute("bType") == "Dbpos" ||
(string)dataAttribute.Attribute("bType") == "Struct") &
(string)dataAttribute.Attribute("name") != "origin"

select new dataset_content()
{
DoName = (string)fcda.Attribute("doName"),
DaName = (string)dataAttribute.Attribute("name")
}
}

有简单的方法吗?

【问题讨论】:

    标签: c# sql xml linq join


    【解决方案1】:

    我会像这样使用连接。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Xml;
    using System.Xml.Linq;
    
    
    
    namespace ConsoleApplication1
    {
        class Program
        {
            const string FILENAME = @"c:\temp\test.xml";
            static void Main(string[] args)
            {
                XDocument doc = XDocument.Load(FILENAME);
    
                List<LNodeType> lNodeTypes = doc.Descendants("LNodeType")
                    .SelectMany(x => x.Elements("DO")
                        .Select(y => new LNodeType() {
                            id = (string)x.Attribute("id"),
                            lnClass = (string)x.Attribute("lnClass"),
                            name = (string)y.Attribute("name"),
                            type = (string)y.Attribute("type")
                        })).ToList();
    
                List<DOType> doTypes = doc.Descendants("DOType")
                    .SelectMany(x => x.Elements("SDO")
                        .Select(y => new DOType()
                        {
                            id = (string)x.Attribute("id"),
                            cdc = (string)x.Attribute("cdc"),
                            name = (string)y.Attribute("name"),
                            type = (string)y.Attribute("type")
                        })).ToList();
    
                List<DAType> daTypes = doc.Descendants("DAType")
                    .SelectMany(x => x.Elements("BDA")
                        .Select(y => new DAType()
                        {
                            id = (string)x.Attribute("id"),
                            valKind = (string)y.Attribute("valKind"),
                            name = (string)y.Attribute("name"),
                            type = (string)y.Attribute("type"),
                            val = (int?)y.Descendants("Val").FirstOrDefault()
                        })).ToList();
    
                var results = (from l in lNodeTypes
                               join dot in doTypes on l.type equals dot.id
                               join dat in daTypes on dot.type equals dat.id into g
                               select new { lnode = l, dot = dot, dat = g }) //, dat = dat })
                              .ToList();
    
            }
        }
        public class LNodeType
        {
            public string id { get; set; }
            public string lnClass { get; set; }
            public string name { get; set; }
            public string type { get; set; }
    
        }
        public class DOType
        {
            public string id { get; set; }
            public string cdc { get; set; }
            public string name { get; set; }
            public string type { get; set; }
    
        }
        public class DAType
        {
            public string id { get; set; }
            public string valKind { get; set; }
            public string name { get; set; }
            public string btype { get; set; }
            public string type { get; set; }
            public int? val { get; set; }
    
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-18
      • 2021-02-17
      相关资源
      最近更新 更多