我正在使用一个工具Xsd2Code,它使用xml架构定义文件生成一个包含多个分部类的DespatchAdvice.designer.cs文件。在我的程序中,我可以方便地填充相关数据并将输出序列化为xml。
然而,通常情况下,并非所有情况都如我所愿。我不需要一些最终被序列化的元素,而不是填充数据只会导致它们序列化为空元素。生成的xml必须符合我们客户设定的严格标准,这些空元素“打破”这些标准。
我有几个选择来解决这个问题。我可以从原始的xsd模式文件中删除这些元素,但它们是由GS1标准组织生成的,任何更新都会破坏我自己的自定义,或者至少要求我重新应用它们。
或者我可以修改Xsd2Code生成的.cs文件,删除不需要的属性。但是,与上述类似,.cs的任何再生都会破坏我的修改。
我目前采用的方法是后者的变体,使用XmlIgnoreAttribute()装饰.cs文件中不需要的属性。在下面的代码片段中,Manifest已由该工具生成,但不得在生成的xml中序列化。除了XmlIgnoreAttribute行之外,所有代码都是自动生成的。
[System.Xml.Serialization.XmlElementAttribute(Order = 3)]
public DocumentIdentification DocumentIdentification
{
get
{
return this.documentIdentificationField;
}
set
{
this.documentIdentificationField = value;
}
}
[System.Xml.Serialization.XmlIgnoreAttribute()] // Exclude Manifest
[System.Xml.Serialization.XmlElementAttribute(Order = 4)]
public Manifest Manifest
{
get
{
return this.manifestField;
}
set
{
this.manifestField = value;
}
}
[System.Xml.Serialization.XmlArrayAttribute(Order = 5)]
[System.Xml.Serialization.XmlArrayItemAttribute(IsNullable = false)]
public List<Scope> BusinessScope
{
get
{
return this.businessScopeField;
}
set
{
this.businessScopeField = value;
}
}
所以问题的关键。有没有办法可以应用XmlIgnoreAttribute而无需修改生成的DespatchAdvice.designer.cs文件(并且无需在重载中重新编码整个Manifest块)?
编辑:
这些是我在生成.cs文件时使用的选项。我从默认值更改的值会突出显示。
答案 0 :(得分:0)
Xsd2Code有一个初始化所有字段的选项,所以我怀疑这里发生的是&#39;默认&#39; Manifest
已创建,这是您在序列化对象图时所看到的内容。
XmlSerializer
行为是省略null
的元素,除非XmlElement
属性的IsNullable
property设置为true
。在这种情况下,它会使用xsi:nil="true"
属性序列化一个空元素。
因此,我建议您只想设置要忽略的元素null
,而不是尝试添加或覆盖属性(使用XmlAttributeOverrides
可以实现)。< / p>