2009-10-07 5 views
1

XML 문자열의 데이터를 일종의 구조로로드하려고 시도 했으므로 일단로드되면 Data.PropertyName에서 값을 읽을 수 있습니다.xml 값을 구조에로드하는 가장 효율적인 방법입니까?

아래 코드는 구조에 데이터를로드하는 가장 좋은 방법입니까?

분명히 First()를 호출하면 메모리가 손상 될 수 있습니다. 따라서 하위 요소가있는 요소가있는 경우 First()를 호출하면 문제가됩니다.

감사

string xml = @"<ROOT> 
        <ID>1</ID> 
        <NAME>RF1</NAME> 
        <STAT>10200</STAT> 
        <TEST> 
         <ID>1</ID> 
         <NAME>BIGUN</NAME> 
        </TEST> 
        </ROOT> 
        "; 

    XElement Data = XElement.Parse(xml); 


    var Element = (from p in Data.Descendants("ROOT") 
        select new { 
         ID = (int)p.Element("ID"), 
         Test = new { 
            ID = p.Element("TEST").Descendants("ID").First(), 
            NAME = p.Element("TEST").Descendants("NAME").First() 
           }, 
         Stat = p.Element("STAT") }).First(); 

//Read Element.ID, Element.Test.Name 

답변

3

XmlSerializer을 사용하여 역 직렬화 할 수 있습니까?

using System; 
using System.IO; 
using System.Xml.Serialization; 

[XmlRoot("ROOT")] 
public class MyType 
{ 
    [XmlElement("ID")] 
    public string Id { get; set; } 
    [XmlElement("NAME")] 
    public string Name { get; set; } 
    [XmlElement("STAT")] 
    public string Stat { get; set; } 
    [XmlElement("TEST")] 
    public MyOtherType Nested { get; set; } 
} 
public class MyOtherType 
{ 
    [XmlElement("ID")] 
    public string Id { get; set; } 
    [XmlElement("NAME")] 
    public string Name { get; set; } 
} 
static class Program 
{ 

    static void Main() 
    { 
     string xml = @"<ROOT> 
        <ID>1</ID> 
        <NAME>RF1</NAME> 
        <STAT>10200</STAT> 
        <TEST> 
         <ID>1</ID> 
         <NAME>BIGUN</NAME> 
        </TEST> 
        </ROOT>"; 
     MyType obj = (MyType) new XmlSerializer(typeof(MyType)) 
      .Deserialize(new StringReader(xml)); 
     Console.WriteLine(obj.Id); 
     Console.WriteLine(obj.Name); 
     Console.WriteLine(obj.Stat); 
     Console.WriteLine(obj.Nested.Id); 
     Console.WriteLine(obj.Nested.Name); 
    } 
} 
+0

와우, 고마워. 이전에 그러한 접근법을 본 적이 없었습니다. 이것이 LINQ보다 효율적이라고 말하거나 매우 유사하다고 생각하십니까? 클래스에 XML에 나타나지 않는 XMLElement와 관련된 속성이 있거나 예외를 throw하거나 속성 값을 null로 설정하면 어떻게됩니까? – Jon

+0

@ 존 : XML에서 읽어야 할 내용을 찾으려면 리플렉션을 사용해야하므로 LINQ보다 약간 효율적일 것으로 기대합니다. 확실하게 알아 내기 위해 코드를 프로파일 링해야합니다. XmlElement 특성의 IsNullable 속성을 사용하여 요소가 XML에 필요한지 여부를 지정할 수 있습니다. – Guffa

1

내가 직렬화 가고 싶어 및 XML 속성 : 훨씬 더 읽기.

+0

예제에 대한 링크 또는 예제를 제공 할 수 있습니까? – Jon

+0

마크가 이미했습니다. –

0

아니요, 최적의 방법은 아니지만 충분할 수 있습니다.

성능에 가장 적합한 방법은 여기에 특화된 고유 한 XML 구문 분석기를 작성하는 것이지만 훨씬 더 많은 코드가 될 것입니다.

First 방법에 관심이있는 이유를 모르겠습니다. 첫 번째 항목을 끝까지 읽은 다음 읽기를 중지하므로 문제가 발생하지 않습니다. 물론 XML 파서는 모든 자식을 파싱해야합니다.

관련 문제