如何使用序列化程序使 XML 标签强制使用自关闭标签?
How to make an XML tag mandatory with a self-closing tag, using the serialiser?
我正在开发 C# 程序,我正在尝试序列化 XML。
我有以下标签:
using System.Xml.Serialization;
...
[XmlElement("MV")]
public MultiVerse MultiVerse { get; set; }
当我不填写这个值时,标签 <MV>
不存在,但我想得到一个标签 <MV/>
在这种情况下:
目前我有 <HM><ID>Some_ID</ID></HM>
.
我想要 <HM><ID>Some_ID</ID><MV/></HM>
.
我已经尝试在该行前面加上 [Required]
,但没有用,我认为填写 IsNullable
属性是个好方法。
Edit1,在网上查了一下
网上有很多关于修改XmlWriter
的建议,但在我的项目中,整个序列化是这样完成的:
public override string ToString()
{
...
using (var stream = new StringWriter())
using (var writer = XmlWriter.Create(stream, settings))
{
var serializer = new XmlSerializer(base.GetType());
serializer.Serialize(writer, this, ns);
return stream.ToString();
}
...
}
如您所见,这太笼统了,我不想在这里做任何修改,因此我正在寻找一种自定义 [XmlElement]
指令的方法。
Edit2:XmlWriter 设置:
XmlWriter settings
如下所示:
// Remove Declaration
var settings = new XmlWriterSettings
{
Indent = false,
OmitXmlDeclaration = true,
NewLineHandling = NewLineHandling.None,
NewLineOnAttributes = false,
};
有人有想法吗?
提前致谢
[XmlElement("MV", IsNullable=true)]
public MultiVerse MultiVerse { get; set; }
会给你一个空值,序列化为 <MV xsi:nil="true" />
(或者可能 <MV xsi:nil="true"></MV>
确保短标记符号不是标准作者给你控制的东西,但我的经验是.NET 通常将它用于空元素,因此您可能很幸运,您想要的序列化格式是默认的 .NET 输出格式)。
这是我目前解决问题的方式(别笑):
public override string ToString()
{
string temp = base.ToString();
temp = temp.Replace(" p2:nil=\"true\"", "");
temp = temp.Replace(" xmlns:p2=\"http://www.w3.org/2001/XMLSchema-instance\"", "");
temp = temp.Replace("MV />", "MV/>");
return temp;
}
这太可笑了!有人有更好的解决方案吗?
谢谢
我正在开发 C# 程序,我正在尝试序列化 XML。
我有以下标签:
using System.Xml.Serialization;
...
[XmlElement("MV")]
public MultiVerse MultiVerse { get; set; }
当我不填写这个值时,标签 <MV>
不存在,但我想得到一个标签 <MV/>
在这种情况下:
目前我有 <HM><ID>Some_ID</ID></HM>
.
我想要 <HM><ID>Some_ID</ID><MV/></HM>
.
我已经尝试在该行前面加上 [Required]
,但没有用,我认为填写 IsNullable
属性是个好方法。
Edit1,在网上查了一下
网上有很多关于修改XmlWriter
的建议,但在我的项目中,整个序列化是这样完成的:
public override string ToString()
{
...
using (var stream = new StringWriter())
using (var writer = XmlWriter.Create(stream, settings))
{
var serializer = new XmlSerializer(base.GetType());
serializer.Serialize(writer, this, ns);
return stream.ToString();
}
...
}
如您所见,这太笼统了,我不想在这里做任何修改,因此我正在寻找一种自定义 [XmlElement]
指令的方法。
Edit2:XmlWriter 设置:
XmlWriter settings
如下所示:
// Remove Declaration
var settings = new XmlWriterSettings
{
Indent = false,
OmitXmlDeclaration = true,
NewLineHandling = NewLineHandling.None,
NewLineOnAttributes = false,
};
有人有想法吗?
提前致谢
[XmlElement("MV", IsNullable=true)]
public MultiVerse MultiVerse { get; set; }
会给你一个空值,序列化为 <MV xsi:nil="true" />
(或者可能 <MV xsi:nil="true"></MV>
确保短标记符号不是标准作者给你控制的东西,但我的经验是.NET 通常将它用于空元素,因此您可能很幸运,您想要的序列化格式是默认的 .NET 输出格式)。
这是我目前解决问题的方式(别笑):
public override string ToString()
{
string temp = base.ToString();
temp = temp.Replace(" p2:nil=\"true\"", "");
temp = temp.Replace(" xmlns:p2=\"http://www.w3.org/2001/XMLSchema-instance\"", "");
temp = temp.Replace("MV />", "MV/>");
return temp;
}
这太可笑了!有人有更好的解决方案吗?
谢谢