2010-01-29 3 views
3

경고 - 저는 XML 전문가가 아닙니다.C#/.NET XML serializer - 속성을 요소 이름으로 사용

:

[XmlArrayItem(ElementName = "Field")] 
public List<UserInfoField> Fields; 

[Serializable, XmlRoot("Field")] 
public class UserInfoField 
{ 
    [XmlAttributeAttribute("name")] 
    public string Name; 

    [XmlText] 
    public string Value; 

    [XmlAttributeAttribute("look-up")] 
    public bool LookUp; 
} 

대신이 직렬화 출력을 얻을 수 어쨌든 거기 :

<Fields> 
    <Field name="BusinessName" look-up="true">My Business</Field> 
    <Field name="BusinessType" look-up="false">Nobody really knows!</Field> 
</Fields> 

이 다시 매핑 : 여기

내가 가진 무엇
<Fields> 
    <BusinessName look-up="true">My Business</BusinessName> 
    <BusinessType look-up="false">Nobody really knows!</BusinessType> 
</Fields> 
잘 (

나는이 지나치게 마법이 될 수 있으며이 작동 안 좋은 이유가 상상할 수있는 것을 이해 ...하지만 나는 그것이 수도 파악하고이 :)

답변

3

XmlSerializer를 요청할 수있는 좋은 장소입니다 , 모든 프레임 워크 시리얼 라이저 실제로) 이름이 아닌 형식을 기본적으로 직렬화합니다. 속성 꾸미기를 사용하면 이름 앞에 조금 닿아도되지만 정적 런타임 조회이므로 해당 구조를 사용하는 직렬화 프로세스에 개입하지 않아도됩니다.

대신에 사용자가 원하는 것은 사용자 고유의 직렬화 루틴을 작성하는 것입니다. 기본적으로 이름 필드의 특성을 노드 이름으로 삽입하여 원하는 노드 명명 순서를 대체 할 수 있습니다. IXmlSerializable 인터페이스를 구현하는 데 관심이 있습니다. deserialization을 처리 할 때도 마찬가지입니다.

+0

, 당신이 속성을 사용하여 요소의 이름을 덮어 쓸 수 있습니다 할 [XmlArrayItem] –

+0

당신은 같이 동적으로 XmlSerializer를를 사용하여 요소 이름을 재정의 할 수 없습니다. 정적으로 정의 할 수 있지만이 경우에는 데이터 값을 기반으로하는 이름이 필요합니다. 댓글을 수정하거나 삭제하십시오. 정확하지 않습니다. – jro

2

가 여기 그러나


http://msdn.microsoft.com/en-us/library/2baksw0z(v=vs.71).aspx

[XmlArray("Fields")] 
[XmlArrayItem("Field")] 
public List<UserInfoField> Fields; 
을 말한다으로 당신은 내가 루트 arroung 직렬화를 제안, 모두 [XmlArray][XmlArrayItem]와 속성을 사용할 수 있습니다 수준 :

<root> 
    <Fields> 
    <Field name="BusinessName" look-up="true">My Business</Field> 
    <Field name="BusinessType" look-up="false">Nobody really knows!</Field> 
    </Fields> 
</root> 

그래서 루트와 목록이있는 기본 클래스를 갖게됩니다. D 요소의 다른 클래스 : 그것은 정확하지

[Serializable, XmlRoot("Root")] 
public class Fields 
{ 

    [XmlArray("Fields")] 
    [XmlArrayItem(ElementName = "Field")] 
    public List<UserInfoField> Fields; 
} 

[Serializable, XmlRoot("Field")] 
public class UserInfoField 
{ 
    [XmlAttributeAttribute("name")] 
    public string Name; 

    [XmlText] 
    public string Value; 

    [XmlAttributeAttribute("look-up")] 
    public bool LookUp; 
} 
+1

이것은 OP의 직렬화 된 출력을 생성하지 않습니다. – jro

관련 문제