2009-08-06 3 views
13
유래 (닷넷 2.0)에

첫 번째 질문 : 이제XML 직렬화 - XML ​​루트

public XmlDocument GetEntityXml() 
    {   
     StringWriter stringWriter = new StringWriter(); 
     XmlDocument xmlDoc = new XmlDocument();    

     XmlTextWriter xmlWriter = new XmlTextWriter(stringWriter); 

     XmlSerializer serializer = new XmlSerializer(typeof(List<T>)); 

     List<T> parameters = GetAll(); 

     serializer.Serialize(xmlWriter, parameters); 

     string xmlResult = stringWriter.ToString(); 

     xmlDoc.LoadXml(xmlResult); 

     return xmlDoc; 
    } 

이됩니다

그래서 나는 다음과 목록의 XML을 반환하는 것을 시도하고있다 이미 정의한 여러 엔티티에 사용됩니다. 이러한 엔티티를 가져올 때 나 같은 루트 모든 시간을 얻을 수있는 방법이 있나요

<ArrayOfCat> 
    <Cat> 
    <Name>Tom</Name> 
    <Age>2</Age> 
    </Cat> 
    <Cat> 
    <Name>Bob</Name> 
    <Age>3</Age> 
    </Cat> 
</ArrayOfCat> 

:

내가 XML 같은 것을 할 것 List<Cat>

의 XML을 좀하고 싶습니다 말 ?

예 :

<Entity> 
    <Cat> 
    <Name>Tom</Name> 
    <Age>2</Age> 
    </Cat> 
    <Cat> 
    <Name>Bob</Name> 
    <Age>3</Age> 
    </Cat> 
</Entity> 

또한 내가 돌아 List<Cat>

+0

"항상 같은 루트를 얻으시겠습니까?" 자세한 내용을 알려주세요 ... –

답변

30

훨씬 쉬운 방법이 있습니다 :

public XmlDocument GetEntityXml<T>() 
{ 
    XmlDocument xmlDoc = new XmlDocument(); 
    XPathNavigator nav = xmlDoc.CreateNavigator(); 
    using (XmlWriter writer = nav.AppendChild()) 
    { 
     XmlSerializer ser = new XmlSerializer(typeof(List<T>), new XmlRootAttribute("TheRootElementName")); 
     ser.Serialize(writer, parameters); 
    } 
    return xmlDoc; 
} 
8

에 XML을 역 직렬화 만약 내가 제대로 이해하고, 문서의 루트는 항상 동일하게하려는 의도하지 않는 점에 유의 어떤 컬렉션에있는 요소의 유형? 이 경우 당신은 XmlAttributeOverrides를 사용할 수 있습니다

 XmlAttributeOverrides overrides = new XmlAttributeOverrides(); 
     XmlAttributes attr = new XmlAttributes(); 
     attr.XmlRoot = new XmlRootAttribute("TheRootElementName"); 
     overrides.Add(typeof(List<T>), attr); 
     XmlSerializer serializer = new XmlSerializer(typeof(List<T>), overrides); 
     List<T> parameters = GetAll(); 
     serializer.Serialize(xmlWriter, parameters); 
+0

위대한 작품처럼 매력. 감사합니다. –

6

같은 일을 더 좋은 방법 :

public XmlDocument GetEntityXml<T>() 
{ 
    XmlAttributeOverrides overrides = new XmlAttributeOverrides(); 
    XmlAttributes attr = new XmlAttributes(); 
    attr.XmlRoot = new XmlRootAttribute("TheRootElementName"); 
    overrides.Add(typeof(List<T>), attr); 

    XmlDocument xmlDoc = new XmlDocument(); 
    XPathNavigator nav = xmlDoc.CreateNavigator(); 
    using (XmlWriter writer = nav.AppendChild()) 
    { 
     XmlSerializer ser = new XmlSerializer(typeof(List<T>), overrides); 
     List<T> parameters = GetAll<T>(); 
     ser.Serialize(writer, parameters); 
    } 
    return xmlDoc; 
} 
+0

왜 더 나아 졌는지 설명해 주시겠습니까? –

+0

중요한 것은 XmlDocument로 직접 serialize하는 것입니다. 코드에서 결과를 구문 분석하여 문서로 다시 가져와야했습니다. 또한 귀하의 코드는 XmlTextWriter를 사용했으며, 이는 대부분 폐기되었습니다. –

+0

이해해 줘서 고마워. –

2

너무 간단 ....

public static XElement ToXML<T>(this IList<T> lstToConvert, Func<T, bool> filter, string rootName) 
{ 
    var lstConvert = (filter == null) ? lstToConvert : lstToConvert.Where(filter); 
    return new XElement(rootName, 
     (from node in lstConvert 
     select new XElement(typeof(T).ToString(), 
     from subnode in node.GetType().GetProperties() 
     select new XElement(subnode.Name, subnode.GetValue(node, null))))); 

} 
+0

당신은 한 단계 아래로 내려갑니다. 물론 간단합니다. – James