2013-08-15 2 views
0

두 요소의 InnerText를 쌍으로 만들려고하는데 결국 올바른 결과를 얻었지만 효율적이라고 확신하지 못합니다. 나는 "j ..에서"그리고 "k ..에서"생각하고 있습니다. 요소를 두 번 반복해야합니까?
내 솔루션과 동일한 그룹이 있습니까?Linq XML 및 복합 쿼리

<datasource version="2"> 
... 
<dataobject id="1" type="HMIPage.Generic" format="propertybag"> 
    <property name="AddressFlags">0</property> 
    <property name="AddressType">0</property> 
    <property name="ObjectType">0</property> 
    <property name="PointRefFlags">0</property> 
    <property name="PointRefParamName">ModeState</property> 
    <property name="PointRefParamOffset">0</property> 
    <property name="PointRefPointName">01VE05_KMD</property> 
    <property name="PresentationType">0</property> 
    <property name="SecurityLevel">2</property> 
    <property name="UpdatePeriod">0</property> 
    <property name="version">1.2</property> 
</dataobject> 
<dataobject id="2" type="HMIPage.Generic" format="propertybag"> 
    <property name="AddressFlags">1</property> 
    <property name="AddressType">0</property> 
    <property name="ObjectType">0</property> 
    <property name="PointRefFlags">0</property> 
    <property name="PointRefParamName">PointState</property> 
    <property name="PointRefParamOffset">0</property> 
    <property name="PointRefPointName">01VE05_P1</property> 
    <property name="PresentationType">0</property> 
    <property name="SecurityLevel">2</property> 
    <property name="UpdatePeriod">0</property> 
    <property name="version">1.2</property> 
</dataobject> 
<dataobject id="3" type="HMIPage.PushButton" format="propertybag"> 
    <property name="Flags">0</property> 
    <property name="PBActionType">1</property> 
    <property name="RepeatFlag">0</property> 
    <property name="SecurityLevel">2</property> 
    <property name="StationIndex">0</property> 
    <property name="TaskLrn">21</property> 
    <property name="TaskParam1">1</property> 
    <property name="TaskParam2">223</property> 
    <property name="TaskParam3">0</property> 
    <property name="TaskParam4">0</property> 
    <property name="version">1.2</property> 
</dataobject> 
... 
</datasource> 

출력 :

01VE05_KMD.ModeState
01VE05_P1.PointState

답변

1
var query = xdoc.Root.Elements("dataobject") 
     .Where(x=>x.Attribute("type").Value=="HMIPage.Generic") 
     .Elements("property") 
     .Where(x=>x.Attribute("name").Value== "PointRefParamName"||x.Attribute("name").Value== "PointRefPointName") 
     .Select(x=>x.Value); 
+0

덕분에 @jyparask

var query = from i in xdoc.Element("datasource") .Elements("dataobject") where (string)i.Attribute("type") == "HMIPage.Generic" from j in i.Elements("property") where (string)j.Attribute("name") == "PointRefParamName" let param = j.Value from k in i.Elements("property") where (string)k.Attribute("name") == "PointRefPointName" let point = k.Value select new { PointName = point, ParamName = param }; foreach (var tag in query) { Console.WriteLine("{0}.{1}", tag.PointName, tag.ParamName); } 

소스 파일입니다. 나는 어딘가에 같은 해결책을 내놓았지만 올바른 결과물을 얻지 못했다. 다른 모든 항목은 "PointRefParamName"이고 다른 모든 항목은 "PointRefPointName"이기 때문에 쿼리에서 현재 항목과 다음 항목을 함께 처리하는 foreach 루프를 사용합니다. 나는 당신이 그것에 끼워 넣은 노력에 감사하기 때문에 나는 투표 할 것이지만, 나는 그것을 올바른 해결책으로 표시하지 않을 것이다. – Seatech