2010-05-20 4 views
1

변경할 수없는 다음 XML 부분이 있습니다. 내가 public List<Column> Columns {get;set;} 속성에 직렬화하는XmlSerializer - 다른 요소를 같은 요소의 컬렉션으로 비 직렬화

<COLUMNS LIST="20" PAGE="1" INDEX="reg_id"> 
    <NUMBER WIDTH="3"/> 
    <REGION WIDTH="60"/> 
    <MENTION WIDTH="7"/> 
    <FEDERAL WIDTH="30"/> 
</COLUMNS> 

: 번호, 지역, 언급, 연방은 열입니다. 그래서 요소 이름은 Column.Name으로 갈 것입니다. 열 클래스 :

public class Column 
{ 
    //Name goes from Element Name 
    public string Name {get;set;} 
    [XmlAttribute("WIDTH")] 
    public int Width {get;set;} 
} 

XmlSerializer 클래스로 가능합니까?

답변

2

스키마를 변경할 수 없으면 스키마가 변경되지 않을 가능성이 높습니다. (이것이 유효한 가정이 아니면 알려주십시오.)이 경우 XmlSerializer를 사용하면 잔인한 행위가 될 수 있습니다. XML에 Linq를 사용하지 않는 이유는 무엇입니까?

class Program 
{ 
    static void Main(string[] args) 
    { 
     XDocument doc = XDocument.Load(@".\Resources\Sample.xml"); 

     var columns = from column in doc.Descendants("COLUMNS").Descendants() 
         select new Column(column.Name.LocalName, int.Parse(column.Attribute("WIDTH").Value)); 

     foreach (var column in columns) 
      Console.WriteLine(column.Name + " | " + column.Width); 
    } 

    class Column 
    { 
     public string Name { get; set; } 
     public int Width { get; set; } 

     public Column(string name, int width) 
     { 
      this.Name = name; 
      this.Width = width; 
     } 
    } 
} 

위의 snippit은 샘플 XML을로드 한 다음 그 열의 열거 형을 만듭니다. 간단하고 효과적입니다. 그러나 .NET 3.0 이상이 필요하므로 옵션이 아닌 경우이 솔루션은 불행히도 사용할 수 없습니다.

XML 문서에 대한 마이크로 소프트의 Linq에 대한 링크 : 다른 태그 이름에 대해 서로 다른 클래스를 지정하는 것도 가능하다

[XmlElement("NUMBER")] 
[XmlElement("REGION")] 
[XmlElement("MENTION")] 
[XmlElement("FEDERAL")] 
public List<Column> Columns {get;set;} 

:

http://msdn.microsoft.com/en-us/library/bb387098.aspx

+1

Linq-to-XML이 어떤 이유로 든 바람직하지 않은 경우 XPath를 사용할 수 있습니다. –

+0

아주 좋은 지적입니다! XPath는 XML에 대해 Linq와 매우 유사하며 XPath에는 .NET 3.0 이상이 필요하지 않습니다. –

3

당신은 하나 개의 속성에 여러 XmlElements을 사용할 수 있습니다 :

[XmlElement(ElementName = "One", Type = typeof(OneItem))] 
[XmlElement(ElementName = "Two", Type = typeof(TwoItem))] 
public List<BaseItem> Items {get;set;}