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)를 어떻게 알 수 있습니까?
감사합니다. 즉, SpecialHandling 라인에도 추가해야합니다. 문자열을 작성하지 않고 객체에 추가하기 만하면됩니다. 문자열을 구문 분석하고 모든 적절한 위치에 네임 스페이스를 추가해야합니다. XmlDocument, LoadXml 및 DocumentElement는 네임 스페이스를 한 번만 설정하기를 바라지 만 방법이없는 것처럼 보입니다. 나는 선택권을 놓쳤는가? 직렬화 할 대량의 XML을 추가하는 경우에도이 방법이 올바른 것입니까? – sldorman
@sldorman 아니요, 위와 같이 문자열 만 있으면됩니다. 기본 네임 스페이스는 상속됩니다 (따라서 이전에 하나의'xmlns = ""'를 추가하고 더 넓은 문서에는 단 하나의 선언 만 있음). XML을 먼저 구문 분석해야하는 경우 LINQ to XML을 사용하여 모든 요소의 네임 스페이스를 변경하는 것이 간단합니다. –
네 말이 맞아. 두 번째 줄에 빈 네임 스페이스가 있기 때문에 시도했을 때 오타가 발생했습니다. 다시 한번 감사드립니다. – sldorman