【问题标题】:XML Deserialization Producing Incorrect ResultsXML 反序列化产生不正确的结果
【发布时间】:2010-01-06 22:12:16
【问题描述】:

我是一名 XML 初学者,使用 C# .NET 2.0/Visual Studio 2005。

我有一个 XML 数据样本,我想将其转换为强类型数据结构。我还有一个用于该文件的 XSD,我通过 Visual Studio xsd.exe 为它生成代码。我针对System.Xml.Serialization.XmlSerializer 运行它,它做得不错,但需要一些调整。

使用此代码对其运行测试:

static int Main() {
    System.IO.StreamReader str = new System.IO.StreamReader(
        @"C:\xmlstm-2009122816413365.xml");
    System.Xml.Serialization.XmlSerializer xSerializer = new System.Xml.Serialization.XmlSerializer(typeof(AidStatements));
    AidStatements statementDataSet = (AidStatements)xSerializer.Deserialize(str);

    foreach (AssocRecord associations in statementDataSet.AssocRecords) {
        foreach (statementrecord statement in associations.statementrecord) {
            Console.WriteLine(statement.acctno);
        }
    }

    str.Close();

    Console.ReadLine();

    return 0;
}

测试代码只是从每条记录中打印出帐号。

问题是生成的代码忽略了文件中的一半记录。我认为这与<Assoc-Record> 元素有关。

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
    <xs:element name="Aid-Statements">
        <xs:complexType>
            <xs:sequence>
                <xs:element maxOccurs="unbounded" ref="Assoc-Record"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="Assoc-Record">
    <xs:complexType>
        <xs:sequence>
            <xs:element maxOccurs="unbounded" ref="statement-record"/>
        </xs:sequence>
    </xs:complexType>
    </xs:element>
    <xs:element name="statement-record">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="assoc-no"/>
                <xs:element ref="acct-no"/>
                <xs:element ref="acct-no-mask"/>
                <xs:element ref="member-no"/>
                <xs:element ref="cr-code"/>
                <xs:element ref="stm-bal-fwd-date"/>
                <xs:element ref="stm-close-date"/>
                <xs:element ref="stm-due-date"/>
                <xs:element ref="prop-address-info"/>
                <xs:element ref="own-mail-info"/>
                <xs:element ref="messages"/>
                <xs:element ref="balances"/>
                <xs:element ref="trx-detail"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    ...

xsd.exe 生成的代码是这样的(sn-p):

[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.42")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
[System.Xml.Serialization.XmlRootAttribute("Aid-Statements", Namespace="", IsNullable=false)]
public partial class AidStatements {

    private statementrecord[] assocRecordField;

    /// <remarks/>
    [System.Xml.Serialization.XmlArrayAttribute("Assoc-Record")]
    [System.Xml.Serialization.XmlArrayItemAttribute("statement-record", typeof(statementrecord), IsNullable=false)]
    public statementrecord[] AssocRecord {
        get {
            return this.assocRecordField;
        }
        set {
            this.assocRecordField = value;
        }
    }
}

[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.42")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
[System.Xml.Serialization.XmlRootAttribute("statement-record", Namespace="", IsNullable=false)]
public partial class statementrecord {
    private string assocnoField;
    private string acctnoField;
    private string acctnomaskField;
    private string membernoField;
    private string crcodeField;
    private string stmbalfwddateField;
    private string stmclosedateField;
    private string stmduedateField;
    private propaddressinfo propaddressinfoField;
    private ownmailinfo ownmailinfoField;
    private messages messagesField;
    private balances balancesField;
    private trxrecord[] trxdetailField;
    // Matching properties below this
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.42")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
[System.Xml.Serialization.XmlRootAttribute("Assoc-Record", Namespace="", IsNullable=false)]
public partial class AssocRecord {

    private statementrecord[] statementrecordField;

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("statement-record")]
    public statementrecord[] statementrecord {
        get {
            return this.statementrecordField;
        }
        set {
            this.statementrecordField = value;
        }
    }
}

看起来xsd.exe 错误地假设了关于&lt;Assoc-Record&gt; 的某些内容,但到目前为止我尝试过的没有任何帮助。尝试将&lt;Assoc-Record&gt; 设置为数组属性(尽我所能)没有产生任何结果;代码运行,但 &lt;Assoc-Record&gt; 不包含任何 &lt;statement-record&gt; 元素(如何是零长度数组)。

另外,xsd.exe 最初将AidStatements.assocRecordField 转换为二维数组,我将其更改为一维数组以使其在当前状态下运行。

有什么想法吗?

【问题讨论】:

    标签: c# xml visual-studio-2005 xml-serialization xsd


    【解决方案1】:

    AidStatements 类应如下所示:

    public partial class AidStatements
    {
      [XmlElement("Assoc-Record")]
      public AssocRecord[] AssocRecords;
    }
    

    XSD 架构看起来相当混乱 - 序列包含对元素的引用,而不是包含特定类型元素的序列,这可能会混淆 xsd.exe(所有这些 XmlTypeAttribute(AnonymousType=true) 看起来很奇怪)。

    【讨论】:

    • 哈哈,不开玩笑。当我看到架构时,即使我不是 XML/XSD 方面的专家,我也知道会感到失望。
    • 第二天我开始尝试这个修复程序,虽然之后它并没有完美运行,但它确实让我足够接近,可以进行我需要的更改以使其运行。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-18
    • 2021-07-16
    • 2011-05-28
    • 2023-03-28
    • 2020-12-14
    • 2015-10-12
    • 2015-01-06
    相关资源
    最近更新 更多