У меня есть следующие потомки файла 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>
Каждый тип элемента является идентификатором другого потомка. Я хочу создать сплющенный список с указанием c Child. Допустим, 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")
}
}
Есть ли простой способ?