2012-11-21 3 views
3

나는 linq 솔루션을 찾기 위해 그물을 검색했습니다. 그러나 나는 꽤 복잡한 솔루션을 찾을 수 없습니다.linq의 레코드로 xml을 선택하십시오

아래 xml에서 comformation 요소를 어떻게 선택할 수 있습니까? 나는 각 구성 요소 (id, accountnumber, type)를 C#에서 linq를 사용하여 객체에 추가하려고한다.

사실 한 번에 하나의 묶음/레코드로 데이터를 가져 와서 목록에 추가하고 싶습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

XML

string batch = @" 
<batchresult> 
     <outputs> 
    <output> 
     <value> 
     <conformation> 
      <component> 
      <name>cmdinfo</name> 
      <value> 
       <bundle> 
       <data> 
        <value> 
        <state>100</state> 
        </value> 
       </data> 
       </bundle> 
      </value> 
      </component> 
      <component> 
      <name>resultlist</name> 
      <value> 
       <bundle> 
       <data> 
        <value> 
        <conformation> 
         <component> 
         <name>id</name> 
         <value> 
          <state>1</state> 
         </value> 
         </component> 
         <component> 
         <name>accountnumber</name> 
         <value> 
          <string>10505749</string> 
         </value> 
         </component> 
         <component> 
         <name>type</name> 
         <value> 
          <string>subnumber</string> 
         </value> 
         </component> 
        </conformation> 
        </value> 
        <value> 
        <conformation> 
         <component> 
         <name>id</name> 
         <value> 
          <state>2</state> 
         </value> 
         </component> 
         <component> 
         <name>accountnumber</name> 
         <value> 
          <string>53871265</string> 
         </value> 
         </component> 
         <component> 
         <name>type</name> 
         <value> 
          <string>subnumber</string> 
         </value> 
         </component> 
        </conformation> 
        </value> 
       </data> 
       </bundle> 
      </value> 
      </component> 
      <component> 
      <name>batchnumber</name> 
      <value> 
       <bundle> 
       <data> 
        <value> 
        <state>14512367</state> 
        </value> 
       </data> 
       </bundle> 
      </value> 
      </component> 
     </conformation> 
     </value> 
    </output> 
    </outputs> 
    </batchresult>"; 

CODE

 class record 
     { 
      string F1 = ""; 
      public string f1 
      { 
       set { F1 = value; } 
       get { return F1; } 
      } 

      string F2 = ""; 
      public string f2 
      { 
       set { F2 = value; } 
       get { return F2; } 
      } 

      string F3 = ""; 
      public string f3 
      { 
       set { F3 = value; } 
       get { return F3; } 
      } 
     } 


    private void button1_Click(object sender, EventArgs e) 
    { 
      XDocument xmldoc = XDocument.Parse(batch); 
      var obj = from o in xmldoc.Descendants("component") 
         where o.Parent.Name == "conformation" 
    //select new record { f1 = o.Element("name").Value, f2 = o.Element("value").Value, f3 = o.Element("value").Value }; 

         select new record { f1 = o.Element("id").Value, f2 = o.Element("accountnumber").Value, f3 = o.Element("type").Value }; 
      foreach (var d in obj) 
      { 
    record myobj = new record(); 
      myobj.f1=d.f1;//the first object will contain 1 
      myobj.f2=d.f2; //10505749 
      myobj.f3=d.f3;//subnumber .. and so on 
      mylist.Add(myobj); 
      } 
    } 

안녕하세요, 역 직렬화를 시도하지 않은, 내가 그것을 확인합니다. 이 코드 둘 중 하나에서 게시 된 예 :에 대한 정의를 포함하지 않는

오류 15 'System.Xml.Linq.XElement'

XElement doc = XElement.Parse(batch); 
doc.Descendants("conformation").Elements("component").Select(x => 
new record 
{ 
    f1 = x.First().Element("name").Value, 
    f2 = x.Skip(1).First().Element("name").Value, 
    f3 = x.Skip(2).Element("name").Value 
}; 

는 나에게 다음과 같은 오류를 제공 ..is 'First'및 'System.Xml.Linq.XElement'형식의 첫 번째 인수를 받아들이는 확장 메서드가 없습니다 (사용 지시문이나 어셈블리 참조가 누락 되었습니까?)

어떻게 생깁니 까?

+0

당신은 무엇을 어떻게해야합니까? 전체 파일이 아닌 XML 형식 만 게시 할 수 있습니까? – elyashiv

+0

오브젝트를 생성하는 LINQ 대신 왜 XML에 객체를 deserialize하지 않습니까? – LukeHennerley

+0

xml이'correct'가 아닙니다 ... – Anirudha

답변

0

는 XPath를하지 않고이

XDocument doc = XDocument.Parse(batch); 
var result = doc. 
    XPathSelectElements("//component[name[text() = 'resultlist']]"). 
    Descendants("conformation"). 
    Select(y => new record 
     { 
      f1 = (string)y.XPathSelectElement("component[name[text() = 'id']]/value/state"), 
      f2 = (string)y.XPathSelectElement("component[name[text() = 'accountnumber']]/value/string"), 
      f3 = (string)y.XPathSelectElement("component[name[text() = 'type']]/value/string") 
     } 
    ); 

을 시도해보십시오

var result = doc. 
    Descendants("conformation"). 
    Select(x => x.Elements("component")). 
    Select(y => y.Select(z => new { name = (string)z.Element("name"), value = z.Element("value") })). 
    Where(z => z.Any(m => m.name == "id")). 
    Select(a => new record 
     { 
      f1 = (string)a.Where(m => m.name == "id").FirstOrDefault().value.Element("state"), 
      f2 = (string)a.Where(m => m.name == "accountnumber").FirstOrDefault().value.Element("string"), 
      f3 = (string)a.Where(m => m.name == "type").FirstOrDefault().value.Element("string") 
     } 
    );