簡體   English   中英

XSD2Code不生成可選的Enum

[英]XSD2Code not generation optional Enum

我遇到了一個很大的問題,即從多個XSD生成C#類。 序列化期間,Enum成員獲取的值錯誤。 我正在序列化的XML中不存在該屬性,因此我希望它為NULL或'0',但它會獲得值'1',這是Enum中的第一個可用值。

假設我有一個名為“ person.xsd”的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>

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”。 這發生在序列化期間。 我應該怎么做才能解決這個問題?

這里的問題是您的enum屬性在xsd中不可為空。 因此,在不更改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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM