抑制xsi:nil,但仍然显示在.NET中序列化时显示空元素
我有一个C#类,具有20 +字符串属性。我将其中的四分之一设置为实际值。我想序列化类,并得到抑制xsi:nil,但仍然显示在.NET中序列化时显示空元素
<EmptyAttribute></EmptyAttribute>
的输出属性
public string EmptyAttribute {get;set;}
我不希望输出为
<EmptyAttribute xsi:nil="true"></EmptyAttribute>
我使用下面的类
public class XmlTextWriterFull : XmlTextWriter
{
public XmlTextWriterFull(string filename) : base(filename,Encoding.UTF8) { }
public override void WriteEndElement()
{
base.WriteFullEndElement();
base.WriteRaw(Environment.NewLine);
}
}
这样我可以得到完整的标签。我只是不知道如何摆脱xsi:nil。
我实际上能够弄清楚这一点。我知道它有点在某些方面是黑客攻击的,但是这是我得到它的工作
System.Xml.Serialization.XmlSerializer x = new System.Xml.Serialization.XmlSerializer(header.GetType());
XmlTextWriterFull writer = new XmlTextWriterFull(FilePath);
x.Serialize(writer, header);
writer.Flush();
writer.BaseStream.Dispose();
string xml = File.ReadAllText(FilePath);
xml = xml.Replace(" xsi:nil=\"true\"", "");
File.WriteAllText(FilePath, xml);
希望这可以帮助其他人了
-1 ...这是处理XML的可怕方法,请避免这种字符串操作。如果你真的想剥离属性 - 使用正确的XML API ... – 2013-08-28 03:00:17
@AlexeiLevenkov:问题的全部目的是找出最好的方法来做到这一点 - 大概是因为他不知道如何使用API来实现它。有点苛刻批评他不使用它。 更好的回应是提供一个能够正确使用XML API的答案。 – 2013-09-03 03:10:19
@ChrisRogers--已经有了很好的答案 - 所以评论在这里引导人们远离这一点。字符串操作几乎不是处理XML的好方法。 – 2013-09-03 04:20:43
的方式有XmlSerializer
连载的属性不添加xsi:nil="true"
属性如下所示:
[XmlRoot("MyClassWithNullableProp", Namespace="urn:myNamespace", IsNullable = false)]
public class MyClassWithNullableProp
{
public MyClassWithNullableProp()
{
this._namespaces = new XmlSerializerNamespaces(new XmlQualifiedName[] {
new XmlQualifiedName(string.Empty, "urn:myNamespace") // Default Namespace
});
}
[XmlElement("Property1", Namespace="urn:myNamespace", IsNullable = false)]
public string Property1
{
get
{
// To make sure that no element is generated, even when the value of the
// property is an empty string, return null.
return string.IsNullOrEmpty(this._property1) ? null : this._property1;
}
set { this._property1 = value; }
}
private string _property1;
// To do the same for value types, you need a "helper property, as demonstrated below.
// First, the regular property.
[XmlIgnore] // The serializer won't serialize this property properly.
public int? MyNullableInt
{
get { return this._myNullableInt; }
set { this._myNullableInt = value; }
}
private int? _myNullableInt;
// And now the helper property that the serializer will use to serialize it.
[XmlElement("MyNullableInt", Namespace="urn:myNamespace", IsNullable = false)]
public string XmlMyNullableInt
{
get
{
return this._myNullableInt.HasValue?
this._myNullableInt.Value.ToString() : null;
}
set { this._myNullableInt = int.Parse(value); } // You should do more error checking...
}
// Now, a string property where you want an empty element to be displayed, but no
// xsi:nil.
[XmlElement("MyEmptyString", Namespace="urn:myNamespace", IsNullable = false)]
public string MyEmptyString
{
get
{
return string.IsNullOrEmpty(this._myEmptyString)?
string.Empty : this._myEmptyString;
}
set { this._myEmptyString = value; }
}
private string _myEmptyString;
// Now, a value type property for which you want an empty tag, and not, say, 0, or
// whatever default value the framework gives the type.
[XmlIgnore]
public float? MyEmptyNullableFloat
{
get { return this._myEmptyNullableFloat; }
set { this._myEmptyNullableFloat = value; }
}
private float? _myEmptyNullableFloat;
// The helper property for serialization.
public string XmlMyEmptyNullableFloat
{
get
{
return this._myEmptyNullableFloat.HasValue ?
this._myEmptyNullableFloat.Value.ToString() : string.Empty;
}
set
{
if (!string.IsNullOrEmpty(value))
this._myEmptyNullableFloat = float.Parse(value);
}
}
[XmlNamespaceDeclarations]
public XmlSerializerNamespaces Namespaces
{
get { return this._namespaces; }
}
private XmlSerializerNamespaces _namespaces;
}
现在,实例化这个类并对其进行序列化。
// I just wanted to show explicitly setting all the properties to null...
MyClassWithNullableProp myClass = new MyClassWithNullableProp() {
Property1 = null,
MyNullableInt = null,
MyEmptyString = null,
MyEmptyNullableFloat = null
};
// Serialize it.
// You'll need to setup some backing store for the text writer below...
// a file, memory stream, something...
XmlTextWriter writer = XmlTextWriter(...) // Instantiate a text writer.
XmlSerializer xs = new XmlSerializer(typeof(MyClassWithNullableProp),
new XmlRootAttribute("MyClassWithNullableProp") {
Namespace="urn:myNamespace",
IsNullable = false
}
);
xs.Serialize(writer, myClass, myClass.Namespaces);
检索XmlTextWriter
的内容后,你应该有以下的输出:
<MyClassWithNullableProp>
<MyEmptyString />
<MyEmptyNullableFloat />
</MyClassWithNullableProp>
我希望这清楚地说明内置.NET框架XmlSerializer
可用于性能序列化一个空元素,即使属性值为空(或者其他值不想序列化)。另外,我已经展示了如何确保null
属性完全没有序列化。有一点需要注意,如果您应用XmlElementAttribute
并将该属性的IsNullable
属性设置为true
,那么当属性为null
(除非在其他位置重写)时,该属性将与xsi:nil
属性串行化。
这确实是确保生成空元素的绝佳方式。我已经准备好了序列化代码。我只对string属性的空元素感兴趣。我所要做的只是在属性中添加一个班轮来检查String.IsNullOrEmpty,如果为true,则返回String.Empty。干杯!! – 2016-02-07 23:45:01
我认为这正是我所需要的,但您的问题并不完整。而不是' '你想要' '?如果我找到答案,我会回来! –
njplumridge
2010-03-24 17:28:39
我在下面发布了我的答案,并将其发布出来,如果它可以帮助您或者如果您找到了更好的方式发布并让我知道。 – 2010-03-24 19:15:11