2014-07-08 3 views
2

내 응용 프로그램 내에서 데이터를 serialize하는 방식을 변경하고 있습니다. 지금까지 나는 수동으로 모든 것을했는데 많은 코드를 만들었지 만 유연성도 많이 부여 받았다.C# XmlSerialization : 래퍼 추가

이제는 XmlSerializer을 사용하고 있으며 원하는 방식으로 데이터를 제공하기 위해 DataTransferModel을 만들었습니다.

지금 내 방식으로 들어가는 유일한 방법은 XML- 콘텐츠 주위에 래퍼가 있어야한다는 것입니다. 이것은 응용 프로그램의 이름을 포함하는 다른 태그 일뿐입니다. 애플리케이션 내부에서 생성 된 XML 문서 주위에이 태그를 어떻게 추가 할 수 있습니까?

감사합니다. 더 많은 정보가 필요하시면 hestiate to ask to ask.

편집 : 태그는 문서의 첫 번째 태그 여야합니다.

답변

1

그래서이 문제는 내가 원하는대로 XmlDocument을 변경하는 사용자 지정 방법을 사용하여 해결했습니다.

기본적으로 XmlDocument을 "준비"하는 방법을 만들어 원래의 래퍼 태그를 추가합니다. 이 메소드는 XmlDocument을 사용해야하기 전에 매번 호출 할 수 있습니다.

/// <summary> 
    /// Prepares the document to export it. 
    /// Adds the Wrapper tags 
    /// </summary> 
    /// <param name="contentDocument">The Document to prepare.</param> 
    /// <returns>Returns the prepared document.</returns> 
    private static XmlDocument PrepareExportDocument(XmlDocument contentDocument) 
    { 
     XmlDocument returnDoc = new XmlDocument(); 

     XmlNode rootElement = returnDoc.CreateElement("Wrapper-Tag"); 

     XmlNode importedNode = returnDoc.ImportNode(contentDocument.DocumentElement, true); 

     rootElement.AppendChild(importedNode); 

     returnDoc.AppendChild(rootElement); 

     return returnDoc; 
    } 

더 나은 접근법이 있거나이 접근법이 정확하지 않다고 생각되면 의견을 말하고 답을 추가하십시오. 지금 당장이 대답을 받아 들일 것입니다.

0

오브젝트 모델에 다른 레이어를 추가하여 래퍼 요소를 추가합니다. XmlSerializer이고 일반적으로 개체의 거울입니다. 그래서; 당신이 루트 <MyApp> 요소를 원하는 경우, 그 추가 :

[XmlRoot("MyApp")] 
public class SomeWrapper { 
    public YourExistingModel SomeName {get;set;} 
} 

대신에 YourExistingModelSomeWrapper를 직렬화.

+0

꽤 많은 클래스가 직렬화되고 있습니다. 이런 종류의 래퍼가 직렬화하려는 모든 클래스에 대해 일반적으로 작동합니까? YourExistingModel을 사용하여 다른 유형의 클래스 (일반적으로)를 참조 할 수 있습니까? –

+0

@ElMac은 모두 루트 요소 이름과 다음 요소 요소 이름을 갖기를 원하는지 여부에 달려 있습니다 ... 일반적인 이름입니까? –

+0

루트 요소는 항상 동일해야합니다. 다음 요소는 예를 들어 "Settings"또는 "Content"등일 수 있습니다. –