如何在序列化对象时删除手动添加的xml字符串上的空命名空间属性

本文关键字:字符串 xml 属性 命名空间 添加 序列化 对象 删除 | 更新日期: 2023-09-27 17:59:42

我正在使用XmlSerializer将我的对象模型输出到XML。一切都很好,但现在我需要向对象添加几行预构建的XML,而不需要为每行构建类。经过大量搜索,我发现可以使用XmlDocument的LoadXml和DocumentElement调用将xml字符串转换为XmlElement。除了字符串部分有一个空的名称空间之外,我得到了我想要的XML。如何消除空名称空间属性?有没有更好的方法将xml字符串添加到对象中并使其正确序列化?

注意:我只是在创建输出,所以不需要反序列化生成的XML。我对C#、.NET以及XmlSerialize还相当陌生。

这是我的代码:

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);
    }
}

这是我的输出:

<?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="。我相信这是因为我创建的XmlDocument和根序列化对象之间没有关联,所以XmlDocument创建了自己的命名空间。如何告诉XmlDocument(实际上是生成的XmlElement)它与序列化对象属于同一命名空间?

如何在序列化对象时删除手动添加的xml字符串上的空命名空间属性

之所以添加此项,是因为父元素具有命名空间,而AdditionalInfo元素没有。xmlns=""属性更改该元素及其子元素的默认名称空间。

如果您想去掉它,那么您可能希望AdditionalInfo元素与其父元素具有相同的名称空间。在这种情况下,您需要将XML更改为:

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