2016-08-02 2 views
0

XmlSerializer를 사용하여 내 개체 모델을 XML로 출력하고 있습니다. 모든 것이 잘 작동하지만 이제 각 라인에 대한 클래스를 작성하지 않고 객체에 여러 개의 선으로 구성된 XML을 추가해야합니다. 많은 검색을 한 후에 XmlDocument의 LoadXml 및 DocumentElement 호출을 사용하여 XML 문자열을 XmlElement로 변환 할 수 있음을 발견했습니다. 나는 문자열 섹션에 빈 네임 스페이스가 있다는 점을 제외하고는 원하는 XML을 얻는다. 빈 네임 스페이스 속성을 제거하려면 어떻게해야합니까? 개체에 XML 문자열을 추가하고 올바르게 직렬화되도록하는 더 좋은 방법이 있습니까?개체를 serialize 할 때 수동으로 추가 된 XML 문자열에서 빈 네임 스페이스 특성을 제거하는 방법은 무엇입니까?

참고 : 생성 된 XML을 deserialize 할 필요가 없으므로 출력 만 생성하고 있습니다. 나는 C#, .NET 세계에 상당히 익숙하며 따라서 XmlSerialize입니다.

<?xml version="1.0" encoding="utf-8"?> 
<Book xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.somenamespace.com"> 
    <Title>How to Fix Code</Title> 
    <Author>Dee Bugger</Author> 
    <Extension> 
    <AdditionalInfo xmlns=""> 
     <SpecialHandling>Some Value</SpecialHandling> 
    </AdditionalInfo> 
    </Extension> 
</Book> 

그것은 내가 제거 할 AdditionalInfo에서의 xmlns = ""입니다 :

public class Book 
{ 
    public string Title { get; set; } 

    public string Author { get; set; } 

    public XmlElement Extension { get; set; } 

    public Book() 
    { 
    } 

    public void AddExtension() 
    { 
     string xmlString = "<AdditionalInfo>" + 
           "<SpecialHandling>Some Value</SpecialHandling>" + 
          "</AdditionalInfo>"; 

     this.Extension = GetElement(xmlString); 
    } 

    public static XmlElement GetElement(string xml) 
    { 
     XmlDocument doc = new XmlDocument(); 

     doc.LoadXml(xml); 

     return doc.DocumentElement; 
    } 
} 

static void Main(string[] args) 
{ 
    TestSerialization p = new TestSerialization(); 

    Book bookOne = new Book(); 

    bookOne.Title = "How to Fix Code"; 
    bookOne.Author = "Dee Bugger"; 

    bookOne.AddExtension(); 

    System.Xml.Serialization.XmlSerializer serializer = new XmlSerializer(typeof(Book), "http://www.somenamespace.com"); 

    using (var writer = new StreamWriter("C:\\BookReport.xml")) 
    using (var xmlWriter = XmlWriter.Create(writer, new XmlWriterSettings { Indent = true })) 
    { 
     serializer.Serialize(xmlWriter, bookOne); 
    } 
} 

여기 내 출력 :

여기 내 코드입니다. 내가 만든 XmlDocument와 루트 직렬화 된 객체 사이에 연관이 없기 때문에 XmlDocument가 고유 한 네임 스페이스를 생성하므로 이것이 발생한다고 생각합니다. 직렬화 된 객체와 동일한 네임 스페이스에 속한 XmlDocument (실제로 생성 된 XmlElement)를 어떻게 알 수 있습니까?

답변

0

부모 요소에 네임 스페이스가 있고 AdditionalInfo 요소가 없기 때문에이 값이 추가됩니다. xmlns="" 속성은 해당 요소와 그 하위 요소의 기본 네임 스페이스를 변경합니다.

제거하려면 AdditionalInfo 요소가 상위 요소와 동일한 네임 스페이스를 갖기를 원할 것입니다. 이 경우 XML을 다음과 같이 변경해야합니다.

string xmlString = @"<AdditionalInfo xmlns=\"http://www.somenamespace.com\">" + 
        "<SpecialHandling>Some Value</SpecialHandling>" + 
        "</AdditionalInfo>"; 
+0

감사합니다. 즉, SpecialHandling 라인에도 추가해야합니다. 문자열을 작성하지 않고 객체에 추가하기 만하면됩니다. 문자열을 구문 분석하고 모든 적절한 위치에 네임 스페이스를 추가해야합니다. XmlDocument, LoadXml 및 DocumentElement는 네임 스페이스를 한 번만 설정하기를 바라지 만 방법이없는 것처럼 보입니다. 나는 선택권을 놓쳤는가? 직렬화 할 대량의 XML을 추가하는 경우에도이 방법이 올바른 것입니까? – sldorman

+0

@sldorman 아니요, 위와 같이 문자열 만 있으면됩니다. 기본 네임 스페이스는 상속됩니다 (따라서 이전에 하나의'xmlns = ""'를 추가하고 더 넓은 문서에는 단 하나의 선언 만 있음). XML을 먼저 구문 분석해야하는 경우 LINQ to XML을 사용하여 모든 요소의 네임 스페이스를 변경하는 것이 간단합니다. –

+0

네 말이 맞아. 두 번째 줄에 빈 네임 스페이스가 있기 때문에 시도했을 때 오타가 발생했습니다. 다시 한번 감사드립니다. – sldorman