2012-09-09 2 views
0

나는이 XML을 기반으로 C#을 개체를 정의하는 것을 시도하고있다 :C#의 XML 요소 및 속성은 무엇입니까?

<UPDs LUPD="86"> 
    <UPD ID="106"> 
    <ER R="CREn"> 
     <NU UID="1928456" /> 
     <NU UID="1886294" /> 
     <M> 
     <uN>bob · </uN> 
     <mO>fine :D</mO> 
     </M> 

를 지금까지 내가 가지고 :

public class UDPCollection  
{ 
    List<UDP> UDPs; 

    public UDPCollection() 
    { 
     UDPs = new List<UDP>(); 
    } 
} 

public class UDP 
{ 
    public int Id; 
    public List<ER> ERs; 
    public UDP(int id, List<ER> ers) 
    { 
     Id = id; 
     ERs = ers; 
    } 
} 

public class ER 
{ 
    public string LanguageR; 

    public ER(string languager) 
    { 
     LanguageR = languager; 
    } 
} 

내 질문 : 무엇 C#에서에 요소지도를합니까? 수업? 속성은에 무엇을 매핑합니까? 속성? 내가 올바른 방향으로가는거야?

+0

왜 그렇게하고 있습니까? 당신이 작성하려고하는 코드의 목적은 무엇입니까? 귀하의 제목은 귀하의 접근 방식에 뭔가 잘못 될 수 있음을 시사합니다. XML은 문서입니다. XML 데이터가 필요합니까? 읽어. 출력 XML이 필요합니까? 그것을 적어 라. 그게 전부 야. 객체의 구조를 미러링 할 필요는 없습니다. – valentinas

+0

@valentinas - XML을 받고 XDocument로 읽었고 이제이를 C# 클래스 및 속성에 매핑하려고합니다. –

+1

아마도 도움이 될 것입니다 : http://stackoverflow.com/questions/87621/how-do-i-map-xml-to-c-sharp-objects – valentinas

답변

1

클래스와 XmlRoot, XmlElementXmlAttribute 속성을 사용하십시오. 예를 들어 :

using System.Xml.Serialization; 

... 

[XmlRoot("UPDs")] 
public class UDPCollection 
{ 
    // XmlSerializer cannot serialize List. Changed to array. 
    [XmlElement("UPD")] 
    public UDP[] UDPs { get; set; } 

    [XmlAttribute("LUPD")] 
    public int LUPD { get; set; } 

    public UDPCollection() 
    { 
     // Do nothing 
    } 
} 

[XmlRoot("UPD")] 
public class UDP 
{ 
    [XmlAttribute("ID")] 
    public int Id { get; set; } 

    [XmlElement("ER")] 

    public ER[] ERs { get; set; } 

    // Need a parameterless or default constructor. 
    // for serialization. Other constructors are 
    // unaffected. 
    public UDP() 
    { 
    } 

    // Rest of class 
} 

[XmlRoot("ER")] 
public class ER 
{ 
    [XmlAttribute("R")] 
    public string LanguageR { get; set; } 

    // Need a parameterless or default constructor. 
    // for serialization. Other constructors are 
    // unaffected. 
    public ER() 
    { 
    } 

    // Rest of class 
} 

코드는 XML을 작성하는 것입니다 :

using System.Xml.Serialization; 

... 

// Output the XML to this stream 
Stream stream; 

// Create a test object 
UDPCollection udpCollection = new UDPCollection(); 
udpCollection.LUPD = 86; 
udpCollection.UDPs = new [] 
{ 
    new UDP() { Id= 106, ERs = new [] { new ER() { LanguageR = "CREn" }}} 
}; 

// Serialize the object 
XmlSerializer xmlSerializer = new XmlSerializer(typeof(UDPCollection)); 
xmlSerializer.Serialize(stream, udpCollection); 

는 XmlSerializer를 추가 namepsaces을 추가하지 않는 것이하지만, 필요한 경우 그것은 그들없이 XML을 구문 분석 할 수 있습니다. 위의 출력은 다음과 같습니다

<?xml version="1.0"?> 
<UPDs xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:xsd="http://www.w3.org/2001/XMLSchema" LUPD="86"> 
    <UPD ID="106"> 
     <ER R="CREn" /> 
    </UPD> 
</UPDs> 

사용 Deserialize() 방법은 객체로 XML에서 구문 분석 할 수 있습니다.

0

XML 요소와 속성이 반드시 C#의 어떤 것과도 매핑되지는 않습니다. 원하는 경우 클래스 및 속성에 매핑 할 수 있지만 필수는 아닙니다.

기존 XML을 일종의 C# 데이터 구조에 매핑하려면 합리적인 것처럼 보입니다. 공용 필드를 실제 속성으로 바꾸고 목록 속성은 IEnumerable, ICollection 또는 IList와 같이 실제로는 순서가 필요할 경우 덜 구체적인 유형을 나열합니다.