XSD2Code未生成可选枚举
本文关键字:枚举 未生 XSD2Code | 更新日期: 2023-09-27 18:24:49
我在从几个XSD生成C#类时遇到了一个相当大的问题。在序列化过程中,枚举成员得到了错误的值。该属性不存在于我正在序列化的XML中,因此我希望它为NULL或"0",但它得到的却是值"1",这是枚举中第一个可用的值。
假设我有一个名为"person.XSD"的XSD,它看起来是这样的;
person.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema>
<xs:import namespace="http://www.somewhere.nl/folder1/1_1/basisschema/schema/1" schemaLocation="basisschema.xsd"/>
<xs:complexType name="Person">
<xs:annotation>
<xs:documentation>Personal information</xs:documentation>
</xs:annotation>
<xs:sequence>
<xs:element name="SomeType" type="ns:CDT_SomeType" minOccurs="0">
<xs:annotation>
<xs:documentation>Some type.</xs:documentation>
</xs:annotation>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:schema>
personXSD包含一个名为"basisschema.XSD"的基本架构。该文件如下所示;
basisschema.xsd
<xs:schema targetNamespace="http://www.somewhere.nl/folder1/1_1/basisschema/schema/1" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ns="http://www.somewhere.nl/folder1/1_1/basisschema/schema/1">
<xs:complexType name="CDT_SomeType">
<xs:annotation>
<xs:documentation>Some type.</xs:documentation>
</xs:annotation>
<xs:sequence>
<xs:element name="SomeEnumElement" type="ns:LDT_SomeEnumElement">
<xs:annotation>
<xs:documentation>Some enum</xs:documentation>
</xs:annotation>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:schema>
生成的代码如下所示;
Client.cs
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.6.81.0")]
[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace = "http://www.somewhere.nl/folder1/1_1/basisschema/schema/1")]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "http://www.somewhere.nl/folder1/1_1/basisschema/schema/1", IsNullable = true)]
public class Client
{
private CdtSomeType _someType;
public Client()
{
_someType = new CdtSomeType();
}
public CdtSomeType SomeType
{
get
{
return _someType;
}
set
{
_someType = value;
}
}
}
CdtSomeType.cs
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.6.81.0")]
[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace = "http://www.somewhere.nl/folder1/1_1/basisschema/schema/1")]
public class CdtSomeType
{
private LDTSomeEnumElement _someEnumElement;
public LDTSomeEnumElement SomeEnumElement
{
get
{
return _verklaringField;
}
set
{
_verklaringField = value;
}
}
}
我希望Person.cs中有一个"CdtSomeType"类型的可选属性,但这并没有发生。现在,当我们使用以下代码序列化与此XSD匹配的XML文件时;
using (var reader = new StringReader(message))
{
var myXmlObject = (Person)serializer.Deserialize(reader);
//This value isn't available in the XML so I want this to be NULL instead of the default Enum value.
var test = myXmlObject.SomeType.SomeEnumElement;
}
则属性"SomeEnumElement"具有默认枚举值(1),而不是NULL或"0"。这种情况发生在序列化期间。我能做些什么来解决这个问题?
这里的问题是您的枚举属性在xsd中不可为null。因此,如果不更改xsd结构,它就不能返回null或0(0也可以是枚举中的第一个元素)。XSD2Code还应该生成属性,告诉您该枚举元素是否存在于父级中。
像这样的
[System.Xml.Serialization.XmlIgnoreAttribute()]
public bool LDTSomeEnumElementSpecified
{
get
{
return _verklaringField;
}
set
{
_verklaringField = value;
}
}
基于此属性(请注意,它需要具有[System.Xml.Serialization.XmlIgnoreAttribute()]属性),您可以在代码中处理它,例如这样。
string tmp = deserializedObject.LDTSomeEnumElementSpecified ? deserializedObject.LDTSomeEnumElement.ToString() : String.Empty;