문제

비즈니스 객체로 사로화하는 XML이 있습니다. xmlserializer.deserialize를 사용하고 있습니다. 그러나 XML에 포함 된 XMLELEMENT 중 하나가 Xlement를 유지하기를 원합니다.

xlement가 직렬화 할 수 없으므로 직접 수행 할 수 없습니다 (Xmlelementattribute를 사용하여). 또한 해당 요소를 문자열로 직렬화하려고 시도했지만 (두 단계에서 Xelement를 얻으려고 시도) 오류로 실패했습니다.

예상치 못한 노드 유형 요소. DreatementString 메소드는 간단하거나 빈 콘텐츠가있는 요소에서만 호출 할 수 있습니다.

그것이 어떻게 할 수 있는지 아십니까?

다음은 XML과 내가 원하는 결과 객체의 예입니다.

<Person name="Joe">
  <Hobbies>
    <Hobby name="Reading" .../>
    <Hobby name="Photography" .../>
  </Hobbies>
  <HomeAddress>
    ...
  </HomeAddress>
</Person>

물체:

 public class Person
    {
      [XmlAttribute("Name")]
      public string Name {get; set;}
      ?????
      public XElement Hobbies {get; set;}
      [XmlElement("HomeAddress")]
      public Address HomeAddress {get; set;}
    }

작동하지 않는 시도 :

[XmlElement("Hobbies")]
public XElement Hobbies {get; set;}
[XmlElement("Hobbies")]
public string Hobbies {get; set;}
도움이 되었습니까?

해결책

같은 것을 구현하는 노력을 피하기 위해 IXmlSerializable, 당신은 반 숨겨진 패스 스루의 선을 따라 무언가를 할 수 있습니다. XmlElement 재산; 그러나, 당신은 하나의 루트 만 가질 수 있기 때문에 이것이 당신이 원하는 것을 할 수는 없습니다. XElement 값 (예제에 따라 두 가지가 아닙니다); 그렇게하려면 목록이 필요합니다 ...

using System;
using System.ComponentModel;
using System.Xml;
using System.Xml.Linq;
using System.Xml.Serialization;
public class Person
{
    [XmlAttribute("Name")]
    public string Name { get; set; }
    [XmlIgnore]
    public XElement Hobbies { get; set; }

    [XmlElement("Hobbies")]
    [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
    public XmlElement HobbiesSerialized
    {
        get
        {
            XElement hobbies = Hobbies;
            if(hobbies == null) return null;
            XmlDocument doc = new XmlDocument();
            doc.LoadXml(hobbies.ToString());
            return doc.DocumentElement;
        }
        set
        {
            Hobbies = value == null ? null
                : XElement.Parse(value.OuterXml);
        }
    }
    [XmlElement("HomeAddress")]
    public Address HomeAddress { get; set; }
}

public class Address { }

static class Progmam
{
    static void Main()
    {
        var p = new Person { Hobbies = new XElement("xml", new XAttribute("hi","there")) };
        var ser = new XmlSerializer(p.GetType());
        ser.Serialize(Console.Out, p);
    }
}

다른 팁

XML의 생성 방법에 대한 완전한 제어 (전체 책임과 함께)를 위해 클래스가 System.xml.serialization.ixmlserializable 인터페이스를 구현하고 readxml 및 writexml을 재정의 할 수 있습니다. 사전 클래스를 사용하기 전에이 작업을 수행해야했습니다. 특히 널 속성, 빈 필드 등으로 철저히 테스트해야합니다.

http://www.devx.com/dotnet/article/29720

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top