序列化对象时如何删除手动添加的 xml 字符串上的空命名空间属性?
How to remove empty namespace attribute on manually added xml string when serializing object?
我正在使用 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)它与序列化对象属于同一命名空间?
这是因为父元素有命名空间而您的 AdditionalInfo
元素没有。 xmlns=""
属性更改该元素及其子元素的默认命名空间。
如果您想摆脱它,那么您可能希望 AdditionalInfo
元素与其父元素具有相同的名称空间。在这种情况下,您需要将 XML 更改为:
string xmlString = @"<AdditionalInfo xmlns=\"http://www.somenamespace.com\">" +
"<SpecialHandling>Some Value</SpecialHandling>" +
"</AdditionalInfo>";
我正在使用 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)它与序列化对象属于同一命名空间?
这是因为父元素有命名空间而您的 AdditionalInfo
元素没有。 xmlns=""
属性更改该元素及其子元素的默认命名空间。
如果您想摆脱它,那么您可能希望 AdditionalInfo
元素与其父元素具有相同的名称空间。在这种情况下,您需要将 XML 更改为:
string xmlString = @"<AdditionalInfo xmlns=\"http://www.somenamespace.com\">" +
"<SpecialHandling>Some Value</SpecialHandling>" +
"</AdditionalInfo>";