標準の.NET Xml Serializerを使用する場合、すべてのnull値を非表示にする方法はありますか?以下は、私のクラスの出力の例です。 nullに設定されている場合、null可能な整数を出力したくありません。
現在のXml出力:
<?xml version="1.0" encoding="utf-8"?>
<myClass>
<myNullableInt p2:nil="true" xmlns:p2="http://www.w3.org/2001/XMLSchema-instance" />
<myOtherInt>-1</myOtherInt>
</myClass>
私が欲しいもの:
<?xml version="1.0" encoding="utf-8"?>
<myClass>
<myOtherInt>-1</myOtherInt>
</myClass>
XmlSerializerにメンバーをシリアル化するかどうかを指示するパターンShouldSerialize{PropertyName}
を使用して関数を作成できます。
たとえば、クラスプロパティの名前がMyNullableInt
の場合、
public bool ShouldSerializeMyNullableInt()
{
return MyNullableInt.HasValue;
}
完全なサンプルはこちら
public class Person
{
public string Name {get;set;}
public int? Age {get;set;}
public bool ShouldSerializeAge()
{
return Age.HasValue;
}
}
次のコードでシリアル化
Person thePerson = new Person(){Name="Chris"};
XmlSerializer xs = new XmlSerializer(typeof(Person));
StringWriter sw = new StringWriter();
xs.Serialize(sw, thePerson);
次のXMLの結果-年齢がないことに注意してください
<Person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Name>Chris</Name>
</Person>
Chris Taylorが書いたことに加えて、属性としてシリアル化されたものがある場合、{PropertyName}Specified
という名前のクラスのプロパティを使用して、シリアル化する必要があるかどうかを制御できます。コード内:
public class MyClass
{
[XmlAttribute]
public int MyValue;
[XmlIgnore]
public bool MyValueSpecified;
}
XmlElementAttribute.IsNullable
というプロパティが存在します
IsNullableプロパティがtrueに設定されている場合、nsi参照に設定されているクラスメンバーに対してxsi:nil属性が生成されます。
次の例は、XmlElementAttribute
が適用され、IsNullableプロパティがfalseに設定されたフィールドを示しています。
public class MyClass
{
[XmlElement(IsNullable = false)]
public string Group;
}
シリアル化などで名前を変更するために、他のXmlElementAttribute
を見ることができます。
いくつかのデフォルト値を定義できます。これにより、フィールドがシリアル化されなくなります。
[XmlElement, DefaultValue("")]
string data;
[XmlArray, DefaultValue(null)]
List<string> data;
私の場合、null許容の変数/要素はすべてString型でした。そのため、チェックを実行し、string.EmptyをNULLに割り当てました。このようにして、不要なnilおよびxmlns属性を削除しました(p3:nil = "true" xmlns:p3 = "http://www.w3.org/2001/XMLSchema-instance)
// Example:
myNullableStringElement = varCarryingValue ?? string.Empty
// OR
myNullableStringElement = myNullableStringElement ?? string.Empty
private static string ToXml(Person obj)
{
XmlSerializerNamespaces namespaces = new XmlSerializerNamespaces();
namespaces.Add(string.Empty, string.Empty);
string retval = null;
if (obj != null)
{
StringBuilder sb = new StringBuilder();
using (XmlWriter writer = XmlWriter.Create(sb, new XmlWriterSettings() { OmitXmlDeclaration = true }))
{
new XmlSerializer(obj.GetType()).Serialize(writer, obj,namespaces);
}
retval = sb.ToString();
}
return retval;
}
自動生成タグのない独自のxmlを作成することを好みます。これでは、null値を持つノードの作成を無視できます。
public static string ConvertToXML<T>(T objectToConvert)
{
XmlDocument doc = new XmlDocument();
XmlNode root = doc.CreateNode(XmlNodeType.Element, objectToConvert.GetType().Name, string.Empty);
doc.AppendChild(root);
XmlNode childNode;
PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(typeof(T));
foreach (PropertyDescriptor prop in properties)
{
if (prop.GetValue(objectToConvert) != null)
{
childNode = doc.CreateNode(XmlNodeType.Element, prop.Name, string.Empty);
childNode.InnerText = prop.GetValue(objectToConvert).ToString();
root.AppendChild(childNode);
}
}
return doc.OuterXml;
}