부분적으로 XML을 객체로 부수화합니다
-
20-09-2019 - |
문제
비즈니스 객체로 사로화하는 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을 재정의 할 수 있습니다. 사전 클래스를 사용하기 전에이 작업을 수행해야했습니다. 특히 널 속성, 빈 필드 등으로 철저히 테스트해야합니다.