【问题标题】:Complex XML deserialization复杂的 XML 反序列化
【发布时间】:2014-07-23 21:43:39
【问题描述】:

我正在尝试反序列化一个复杂的 XML 文件。我的主类是结构化的,因此它可以获取第一个子节点中的所有信息,我什至拥有它,以便我可以获得两层深的ClientName。但是,除此之外的任何东西似乎都不起作用。我得到一个计数为 1 的列表项,但列表中没有信息。

我的OrderTaxesOrderTransactions 列表返回Count = 1,但所有字段均为空。

我很肯定这是我的班级结构的问题,非常感谢任何有助于纠正这个问题的帮助。

这是 XML:

<OrderDetail>
    <MessageTypeCode>82540</MessageTypeCode>
    <OrderDetailId>59339463</OrderDetailId>
    <ClientInfo>
        <ClientName>LenderName will appear here</ClientName>
    </ClientInfo>
    <OrderTaxes>
        <OrderTax>
            <TaxId>9202225</TaxId>
        </OrderTax>
    </OrderTaxes>
    <OrderTransactions>
        <OrderTransaction>
            <LoanAmount/>
            <Title>
                <TitleVendors>
                    <TitleVendor>
                        <VendorInstructions>blah blah blah blah .</VendorInstructions>
                        <VendorServices>
                            <TitleVendorService>
                                <TitleVendorServiceId>6615159</TitleVendorServiceId>
                                <ServiceCode>1OWNER</ServiceCode>
                                <CustomVendorInstructions>blah blah blah blah blah </CustomVendorInstructions>
                            </TitleVendorService>
                        </VendorServices>
                    </TitleVendor>
                </TitleVendors>
            </Title>
        </OrderTransaction>
    </OrderTransactions>
</OrderDetail>

这是课程:

namespace TSIxmlParser
{
    [XmlRoot("OrderDetail")]
    public class OrderData
    {
        [XmlElement("MessageTypeCode")]
        public string MessageTypeCode { get; set; }

        [XmlElement("OrderDetailId")]
        public string OrderNumber { get; set; }

        [XmlElement("ClientInfo")]
        public List<ClientInfo> ClientInfos = new List<ClientInfo>();

        [XmlArray("OrderTaxes")]
        [XmlArrayItem("OrderTax")]
        public List<OrderTax> OrderTaxes = new List<OrderTax>();

        [XmlArray("OrderTransactions")]
        [XmlArrayItem("OrderTransaction")]
        public List<OrderTransaction> OrderTransactions = new List<OrderTransaction>();
    }

    public class ClientInfo
    {
        [XmlElement("ClientName")]
        public string ClientName { get; set; }
    }

    public class OrderTax
    {
        [XmlElement("TaxId")]
        public string TaxId { get; set; }
    }

    public class OrderTransaction
    {
        [XmlElement("LoanAmount")]
        public string LoanAmount { get; set; }

        [XmlArray("Title")]
        [XmlArrayItem("TitleVendors")]
        public List<Title> Titles { get; set; }
    }

    public class Title
    {       
        [XmlArrayItem("TitleVendors")]        
        public List<TitleVendors> TitleVendors { get; set; }
    }

    public class TitleVendors
    {
        [XmlArray("TitleVendor")]
        public List<TitleVendor> TitleVendor { get; set; } 
    }

    public class TitleVendor
    {
        [XmlElement("VendorInstructions")]
        public string VendorInstructions { get; set; }

        [XmlArray("VendorServices")]
        [XmlArrayItem("TitleVendorService")]
        public List<TitleVendorService> VendorServices { get; set; }
    }

    public class TitleVendorService
    {
        [XmlElement("TitleVendorServiceId")]
        public string TitleVendorServiceId { get; set; }
        [XmlElement("ServiceCode")]
        public string ServiceCode { get; set; }
        [XmlElement("CustomVendorInstructions")]
        public string CustomVendorInstructions { get; set; }
    }
}

【问题讨论】:

  • 您打算清除标签前的-s,还是应该在发布前自行测试我们的答案?
  • 我不知道这是一个要求。
  • 不,这不是必需的。但是准备一个易于阅读(并且易于复制和粘贴)的答案表明您的努力和对读者的尊重。
  • 有道理,我也想知道为什么我被否决了。这是我的第二个被无缘无故否决的问题。我觉得我的两个问题都是中肯的,有利于学习过程。

标签: c# xml class deserialization


【解决方案1】:

.NET SDK 为此提供了一个很好的工具。 XML 计划定义工具 (csd.exe)。

更多信息:http://msdn.microsoft.com/en-us/library/x6c1kb0s(v=vs.110).aspx

我使用您的 XML 运行了一个示例,向您展示它是否有效。

  1. 首先,我将您的 XML 保存到我的桌面上的一个名为“sample.xml”的文件中
  2. 我以管理员身份打开了 VS 2012 命令提示符。
  3. 在命令提示符中,我导航到安装 SDK 的目录。对我来说,它安装在这里(可能与各种操作系统或 VS 版本不同):

    C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools

  4. 我运行以下命令为您的 XML 创建 XSD。 (期望 sample.xsd 出现在桌面上)

    xsd "c:\users\glenn\desktop\sample.xml" /outputdir:"c:\users\glenn\desktop"

  5. 我运行以下命令从生成的 XSD 文件创建 CSharp 文件。

    xsd "c:\users\glenn\desktop\sample.xsd" /classes /outputdir:"c:\users\glenn\desktop"

不包括 cmets,这是为您的 XML 架构自定义生成的 CSharp 文件。还有其他选项可以设置命名空间和类型名。有关详细信息,请查看上面的文章。

using System.Xml.Serialization;

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

    private string messageTypeCodeField;

    private string orderDetailIdField;

    private OrderDetailClientInfo[] clientInfoField;

    private OrderDetailOrderTaxesOrderTax[][] orderTaxesField;

    private OrderDetailOrderTransactionsOrderTransaction[][] orderTransactionsField;

        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
public string MessageTypeCode {
    get {
        return this.messageTypeCodeField;
    }
    set {
        this.messageTypeCodeField = value;
    }
}

/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
public string OrderDetailId {
    get {
        return this.orderDetailIdField;
    }
    set {
        this.orderDetailIdField = value;
    }
}

/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute("ClientInfo", Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
public OrderDetailClientInfo[] ClientInfo {
    get {
        return this.clientInfoField;
    }
    set {
        this.clientInfoField = value;
    }
}

/// <remarks/>
[System.Xml.Serialization.XmlArrayAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
[System.Xml.Serialization.XmlArrayItemAttribute("OrderTax", typeof(OrderDetailOrderTaxesOrderTax), Form=System.Xml.Schema.XmlSchemaForm.Unqualified, IsNullable=false)]
public OrderDetailOrderTaxesOrderTax[][] OrderTaxes {
    get {
        return this.orderTaxesField;
    }
    set {
        this.orderTaxesField = value;
    }
}

/// <remarks/>
[System.Xml.Serialization.XmlArrayAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
[System.Xml.Serialization.XmlArrayItemAttribute("OrderTransaction", typeof(OrderDetailOrderTransactionsOrderTransaction), Form=System.Xml.Schema.XmlSchemaForm.Unqualified, IsNullable=false)]
public OrderDetailOrderTransactionsOrderTransaction[][] OrderTransactions {
    get {
        return this.orderTransactionsField;
    }
    set {
        this.orderTransactionsField = value;
    }
}

}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.33440")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
public partial class OrderDetailClientInfo {

private string clientNameField;

/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
public string ClientName {
    get {
        return this.clientNameField;
    }
    set {
        this.clientNameField = value;
    }
}

}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.33440")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
public partial class OrderDetailOrderTaxesOrderTax {

private string taxIdField;

/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
public string TaxId {
    get {
        return this.taxIdField;
    }
    set {
        this.taxIdField = value;
    }
}

}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.33440")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
public partial class OrderDetailOrderTransactionsOrderTransaction {

private string loanAmountField;

private OrderDetailOrderTransactionsOrderTransactionTitleTitleVendorsTitleVendor[][][] titleField;

/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
public string LoanAmount {
    get {
        return this.loanAmountField;
    }
    set {
        this.loanAmountField = value;
    }
}

/// <remarks/>
[System.Xml.Serialization.XmlArrayAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
[System.Xml.Serialization.XmlArrayItemAttribute("TitleVendors", typeof(OrderDetailOrderTransactionsOrderTransactionTitleTitleVendorsTitleVendor[]), Form=System.Xml.Schema.XmlSchemaForm.Unqualified, IsNullable=false)]
[System.Xml.Serialization.XmlArrayItemAttribute("TitleVendor", typeof(OrderDetailOrderTransactionsOrderTransactionTitleTitleVendorsTitleVendor), Form=System.Xml.Schema.XmlSchemaForm.Unqualified, IsNullable=false, NestingLevel=1)]
public OrderDetailOrderTransactionsOrderTransactionTitleTitleVendorsTitleVendor[][][] Title {
    get {
        return this.titleField;
    }
    set {
        this.titleField = value;
    }
}

}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.33440")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
public partial class     OrderDetailOrderTransactionsOrderTransactionTitleTitleVendorsTitleVendor {

private string vendorInstructionsField;

private OrderDetailOrderTransactionsOrderTransactionTitleTitleVendorsTitleVendorVendorServicesTitleVendorService[][] vendorServicesField;

/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
public string VendorInstructions {
    get {
        return this.vendorInstructionsField;
    }
    set {
        this.vendorInstructionsField = value;
    }
}

/// <remarks/>
[System.Xml.Serialization.XmlArrayAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
[System.Xml.Serialization.XmlArrayItemAttribute("TitleVendorService", typeof(OrderDetailOrderTransactionsOrderTransactionTitleTitleVendorsTitleVendorVendorServicesTitleVendorService), Form=System.Xml.Schema.XmlSchemaForm.Unqualified, IsNullable=false)]
public OrderDetailOrderTransactionsOrderTransactionTitleTitleVendorsTitleVendorVendorServicesTitleVendorService[][] VendorServices {
    get {
        return this.vendorServicesField;
    }
    set {
        this.vendorServicesField = value;
    }
}

}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.33440")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
public partial class OrderDetailOrderTransactionsOrderTransactionTitleTitleVendorsTitleVendorVendorServicesTitleVendorService {

private string titleVendorServiceIdField;

private string serviceCodeField;

private string customVendorInstructionsField;

/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
public string TitleVendorServiceId {
    get {
        return this.titleVendorServiceIdField;
    }
    set {
        this.titleVendorServiceIdField = value;
    }
}

/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
public string ServiceCode {
    get {
        return this.serviceCodeField;
    }
    set {
        this.serviceCodeField = value;
    }
}

/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
public string CustomVendorInstructions {
    get {
        return this.customVendorInstructionsField;
    }
    set {
        this.customVendorInstructionsField = value;
    }
}

}

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

private OrderDetail[] itemsField;

/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute("OrderDetail")]
public OrderDetail[] Items {
    get {
        return this.itemsField;
    }
    set {
        this.itemsField = value;
    }
}
}

希望这会有所帮助!

【讨论】:

  • 这就像你说的那样工作,遗憾的是它一直在 XmlSerializer() 上给我错误。 ` 无法生成临时类 (result=1)。` 错误 CS0030:无法将类型“OrderDetailClientInfoClientName[]”转换为“OrderDetailClientInfoClientName”错误 CS0030:无法将类型“OrderDetailOrderTaxesOrderTaxTaxId[][]”转换为“OrderDetailOrderTaxesOrderTaxTaxId[]”错误 CS0030 : 无法将类型 'OrderDetailOrderDocumentsOrderDocumentDocumentInformation[][]' 转换为 'OrderDetailOrderDocumentsOrderDocumentDocumentInformation[]' ...等等等等
【解决方案2】:

尝试在相应的属性上使用 XmlArray 和 XmlArrayItem。

[XmlArray("OrderTaxes")]
[XmlArrayItem("OrderTax")]
public List<OrderTax> OrderTaxes = new List<OrderTax>();

[XmlArray("OrderTransactions")]
[XmlArrayItem("OrderTransaction")]
public List<OrderTransaction> OrderTransactions = new List<OrderTransaction>();

这样,序列化程序将知道这些将被视为集合,并知道如何查找特定项目。

除了这两个之外,我想说的是,无论您在哪里定义元素列表,都应该使用这种方法。 TitleVendors 很可能需要类似的东西。

【讨论】:

  • 您的回答对我 90% 的问题有效。现在我无法通过TitleVendors 列表。我的 VendorInstructions 始终为空,而我的 VendorServices 的计数 = 0。
  • @MaylorTaylor,我认为您的 OrderTransaction 应该公开 Title 类型的 Title 属性,而不是 List 类型。除此之外,TitleVendor 应该公开一个 List<titlevendorservice>。我建议扁平化内部类层次结构,以便更清晰地遵循反序列化流程。</titlevendorservice>
【解决方案3】:

好吧,我不确定你是否想要这个(反序列化 XML 的原始转储):

{
    MessageTypeCode: 82540,
    OrderDetailId: 59339463,
    ClientInfo: 
    {
        ClientName: LenderName will appear here
    },
    OrderTaxes: 
    {
        OrderTax: 
        {
            TaxId: 9202225
        }
    },
    OrderTransactions: 
    {
        OrderTransaction: 
        {
            LoanAmount: {},
            Title: 
            {
                TitleVendors: 
                {
                    TitleVendor: 
                    {
                        VendorInstructions: blah blah blah blah .,
                        VendorServices: 
                        {
                            TitleVendorService: 
                            {
                                TitleVendorServiceId: 6615159,
                                ServiceCode: 1OWNER,
                                CustomVendorInstructions: blah blah blah blah blah 
                            }
                        }
                    }
                }
            }
        }
    }
}

所以基本上我只是用Edit -&gt; Paste special -&gt; Paste XML as Classes:

/// <remarks/>
[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)]
public partial class OrderDetail
{

    private uint messageTypeCodeField;

    private uint orderDetailIdField;

    private OrderDetailClientInfo clientInfoField;

    private OrderDetailOrderTaxes orderTaxesField;

    private OrderDetailOrderTransactions orderTransactionsField;

    /// <remarks/>
    public uint MessageTypeCode
    {
        get
        {
            return this.messageTypeCodeField;
        }
        set
        {
            this.messageTypeCodeField = value;
        }
    }

    /// <remarks/>
    public uint OrderDetailId
    {
        get
        {
            return this.orderDetailIdField;
        }
        set
        {
            this.orderDetailIdField = value;
        }
    }

    /// <remarks/>
    public OrderDetailClientInfo ClientInfo
    {
        get
        {
            return this.clientInfoField;
        }
        set
        {
            this.clientInfoField = value;
        }
    }

    /// <remarks/>
    public OrderDetailOrderTaxes OrderTaxes
    {
        get
        {
            return this.orderTaxesField;
        }
        set
        {
            this.orderTaxesField = value;
        }
    }

    /// <remarks/>
    public OrderDetailOrderTransactions OrderTransactions
    {
        get
        {
            return this.orderTransactionsField;
        }
        set
        {
            this.orderTransactionsField = value;
        }
    }
}

/// <remarks/>
[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class OrderDetailClientInfo
{

    private string clientNameField;

    /// <remarks/>
    public string ClientName
    {
        get
        {
            return this.clientNameField;
        }
        set
        {
            this.clientNameField = value;
        }
    }
}

/// <remarks/>
[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class OrderDetailOrderTaxes
{

    private OrderDetailOrderTaxesOrderTax orderTaxField;

    /// <remarks/>
    public OrderDetailOrderTaxesOrderTax OrderTax
    {
        get
        {
            return this.orderTaxField;
        }
        set
        {
            this.orderTaxField = value;
        }
    }
}

/// <remarks/>
[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class OrderDetailOrderTaxesOrderTax
{

    private uint taxIdField;

    /// <remarks/>
    public uint TaxId
    {
        get
        {
            return this.taxIdField;
        }
        set
        {
            this.taxIdField = value;
        }
    }
}

/// <remarks/>
[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class OrderDetailOrderTransactions
{

    private OrderDetailOrderTransactionsOrderTransaction orderTransactionField;

    /// <remarks/>
    public OrderDetailOrderTransactionsOrderTransaction OrderTransaction
    {
        get
        {
            return this.orderTransactionField;
        }
        set
        {
            this.orderTransactionField = value;
        }
    }
}

/// <remarks/>
[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class OrderDetailOrderTransactionsOrderTransaction
{

    private object loanAmountField;

    private OrderDetailOrderTransactionsOrderTransactionTitle titleField;

    /// <remarks/>
    public object LoanAmount
    {
        get
        {
            return this.loanAmountField;
        }
        set
        {
            this.loanAmountField = value;
        }
    }

    /// <remarks/>
    public OrderDetailOrderTransactionsOrderTransactionTitle Title
    {
        get
        {
            return this.titleField;
        }
        set
        {
            this.titleField = value;
        }
    }
}

/// <remarks/>
[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class OrderDetailOrderTransactionsOrderTransactionTitle
{

    private OrderDetailOrderTransactionsOrderTransactionTitleTitleVendors titleVendorsField;

    /// <remarks/>
    public OrderDetailOrderTransactionsOrderTransactionTitleTitleVendors TitleVendors
    {
        get
        {
            return this.titleVendorsField;
        }
        set
        {
            this.titleVendorsField = value;
        }
    }
}

/// <remarks/>
[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class OrderDetailOrderTransactionsOrderTransactionTitleTitleVendors
{

    private OrderDetailOrderTransactionsOrderTransactionTitleTitleVendorsTitleVendor titleVendorField;

    /// <remarks/>
    public OrderDetailOrderTransactionsOrderTransactionTitleTitleVendorsTitleVendor TitleVendor
    {
        get
        {
            return this.titleVendorField;
        }
        set
        {
            this.titleVendorField = value;
        }
    }
}

/// <remarks/>
[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class OrderDetailOrderTransactionsOrderTransactionTitleTitleVendorsTitleVendor
{

    private string vendorInstructionsField;

    private OrderDetailOrderTransactionsOrderTransactionTitleTitleVendorsTitleVendorVendorServices vendorServicesField;

    /// <remarks/>
    public string VendorInstructions
    {
        get
        {
            return this.vendorInstructionsField;
        }
        set
        {
            this.vendorInstructionsField = value;
        }
    }

    /// <remarks/>
    public OrderDetailOrderTransactionsOrderTransactionTitleTitleVendorsTitleVendorVendorServices VendorServices
    {
        get
        {
            return this.vendorServicesField;
        }
        set
        {
            this.vendorServicesField = value;
        }
    }
}

/// <remarks/>
[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class OrderDetailOrderTransactionsOrderTransactionTitleTitleVendorsTitleVendorVendorServices
{

    private OrderDetailOrderTransactionsOrderTransactionTitleTitleVendorsTitleVendorVendorServicesTitleVendorService titleVendorServiceField;

    /// <remarks/>
    public OrderDetailOrderTransactionsOrderTransactionTitleTitleVendorsTitleVendorVendorServicesTitleVendorService TitleVendorService
    {
        get
        {
            return this.titleVendorServiceField;
        }
        set
        {
            this.titleVendorServiceField = value;
        }
    }
}

/// <remarks/>
[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class OrderDetailOrderTransactionsOrderTransactionTitleTitleVendorsTitleVendorVendorServicesTitleVendorService
{

    private uint titleVendorServiceIdField;

    private string serviceCodeField;

    private string customVendorInstructionsField;

    /// <remarks/>
    public uint TitleVendorServiceId
    {
        get
        {
            return this.titleVendorServiceIdField;
        }
        set
        {
            this.titleVendorServiceIdField = value;
        }
    }

    /// <remarks/>
    public string ServiceCode
    {
        get
        {
            return this.serviceCodeField;
        }
        set
        {
            this.serviceCodeField = value;
        }
    }

    /// <remarks/>
    public string CustomVendorInstructions
    {
        get
        {
            return this.customVendorInstructionsField;
        }
        set
        {
            this.customVendorInstructionsField = value;
        }
    }
}

使用的所有代码:

var xmlString = @
"<OrderDetail>
    <MessageTypeCode>82540</MessageTypeCode>
    <OrderDetailId>59339463</OrderDetailId>
    <ClientInfo>
        <ClientName>LenderName will appear here</ClientName>
    </ClientInfo>
    <OrderTaxes>
        <OrderTax>
            <TaxId>9202225</TaxId>
        </OrderTax>
    </OrderTaxes>
    <OrderTransactions>
        <OrderTransaction>
            <LoanAmount/>
            <Title>
                <TitleVendors>
                    <TitleVendor>
                        <VendorInstructions>blah blah blah blah .</VendorInstructions>
                        <VendorServices>
                            <TitleVendorService>
                                <TitleVendorServiceId>6615159</TitleVendorServiceId>
                                <ServiceCode>1OWNER</ServiceCode>
                                <CustomVendorInstructions>blah blah blah blah blah </CustomVendorInstructions>
                            </TitleVendorService>
                        </VendorServices>
                    </TitleVendor>
                </TitleVendors>
            </Title>
        </OrderTransaction>
    </OrderTransactions>
</OrderDetail>";

var xml = new OrderDetail();

System.Xml.Serialization.XmlSerializer serializer = new
System.Xml.Serialization.XmlSerializer(typeof(OrderDetail));

using(XmlReader reader = XmlReader.Create(new StringReader(xmlString))) {
    xml = (OrderDetail) serializer.Deserialize(reader);
}

var xmlDump = xml.Dump();

【讨论】:

  • 我不知道这个“将 XML 粘贴到类”功能。您必须将 TargetFramework 设置为 .Net 4.5,该功能才会出现在 EDIT > Paste Special 菜单下。 (完成此操作后,您可以切换回框架)
  • 我在 Visual Studio for Web 中找到了它:P
【解决方案4】:

由于这仍然是开放的,我想我会快速回答,适合XmlSerializer。在制作课程时,我假设了一个类似这样的模式:

<Foo>
    <Bars>
        <Bar>

表示“Foo”类包含“Bar”类的实例列表。像这样的模式:

<Foo>
    <Bar>

表示“Foo”类包含对“Bar”类实例的单个引用。因此,您的“OrderTransaction”中应该只有一个“Title”,而不是它们的列表:

public class OrderDetail
{
    public string MessageTypeCode { get; set; }
    public string OrderDetailId { get; set; }
    public ClientInfo ClientInfo { get; set; }

    public List<OrderTax> OrderTaxes { get; set; }

    public List<OrderTransaction> OrderTransactions { get; set; }
}

public class OrderTransaction
{
    public string LoanAmount { get; set; }
    public Title Title { get; set; }
}

public class Title
{
    public List<TitleVendor> TitleVendors { get; set; }
}

public class TitleVendor
{
    public string VendorInstructions { get; set; }

    public List<TitleVendorService> VendorServices { get; set; }
}

public class TitleVendorService
{
    public string TitleVendorServiceId { get; set; }
    public string ServiceCode { get; set; }
    public string CustomVendorInstructions { get; set; }
}

public class ClientInfo
{
    public string ClientName { get; set; }
}

public class OrderTax
{
    public string TaxId { get; set; }
}

实际上不需要任何与 XML 相关的修饰。 XmlElementXmlArray 仅在您想要覆盖 XmlSerializer 的默认选项时才需要,例如重命名元素或处理具有多态元素的数组。如果您想清楚起见,或者为了防止以后重命名该属性,您可以放置​​它们,但为了简单起见,我没有这样做。

这是测试设置。我从您的字符串中创建了一个“OrderDetail”实例,然后将其重新序列化为 XML,然后将原始和重写的 XML 保存为文件并在命令提示符窗口中对它们进行比较:

public static class TestOrderDetail
{
    public static string TestString = 

@"<OrderDetail> <MessageTypeCode>82540</MessageTypeCode> <OrderDetailId>59339463</OrderDetailId> <ClientInfo> <ClientName>LenderName will appear here</ClientName> </ClientInfo> <OrderTaxes> <OrderTax> <TaxId>9202225</TaxId> </OrderTax> </OrderTaxes> <OrderTransactions> <OrderTransaction> <LoanAmount/> <Title> <TitleVendors> <TitleVendor> <VendorInstructions>blah blah blah blah .</VendorInstructions> <VendorServices> <TitleVendorService> <TitleVendorServiceId>6615159</TitleVendorServiceId> <ServiceCode>1OWNER</ServiceCode> <CustomVendorInstructions>blah blah blah blah blah </CustomVendorInstructions> </TitleVendorService> </VendorServices> </TitleVendor> </TitleVendors> </Title> </OrderTransaction> </OrderTransactions> </OrderDetail>";

    public static void Test()
    {
        try
        {
            XmlSerializer serializer = new XmlSerializer(typeof(OrderDetail));
            OrderDetail orderDetail = (OrderDetail)serializer.Deserialize(new StringReader(TestString));

            string newTestString = TestWrite(serializer, orderDetail);

            var guid = DateTime.Now.Ticks;
            var path = Path.GetTempPath();
            var file1 = path + Path.DirectorySeparatorChar + "OldOrderDetail_" + guid.ToString() + ".xml";
            var file2 = path + Path.DirectorySeparatorChar + "NewOrderDetail_" + guid.ToString() + ".xml";
            File.WriteAllText(file1, TestString);
            File.WriteAllText(file2, newTestString);
        }
        catch (Exception e)
        {
            Debug.Assert(false, e.ToString());
        }
    }

    private static string TestWrite(XmlSerializer serializer, OrderDetail orderDetail)
    {
        using (var textWriter = new StringWriter())
        {
            XmlWriterSettings settings = new XmlWriterSettings();
            settings.OmitXmlDeclaration = true; // For testing purposes, disable the xml version and encoding declarations.
            settings.Indent = true;
            settings.IndentChars = "    "; // The indentation used in the test string.
            using (XmlWriter xmlWriter = XmlWriter.Create(textWriter, settings))
            {
                XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
                ns.Add("", ""); // For testing purposes, disable the xmlns:xsi and xmlns:xsd lines, which were not in the test string.
                serializer.Serialize(xmlWriter, orderDetail, ns);
            }
            return textWriter.ToString();
        }
    }
}

这是新旧 XML 文件的差异结果:

diff OldOrderDetail_635420738451748332.xml NewOrderDetail_635420738451748332.xml
14c14
<             <LoanAmount/>
---
>             <LoanAmount />

除了在空的“LoanAmount”元素中插入额外的格式化空间之外,没有任何区别。

【讨论】:

    【解决方案5】:

    顺便说一句,XmlSerializer 和 DataContractSerializer 完全不同。根据您的示例,您需要使用 XmlSeralizer(不是 DataContractSerializer)。

    【讨论】:

      【解决方案6】:

      这是我目前所拥有的。此代码生成以下结构:

      -OrderTransactions (Count = 1)
         - Loan Amount = ""
         - Titles (Count = 1)
             -TitleVendors (Count = 1)
                 - VendorInstructions = null
                 - VendorServices (Count = 0)
      

      它似乎看到了 TitleVendors 中的节点,但它没有获取信息。

      <OrderTransactions>
        <OrderTransaction>
          <LoanAmount /> --this may be NULL - this should not cause the message to fail. 
          <Title>
            <TitleVendors>
               <TitleVendor>
                  <VendorInstructions>Endorsements required: EPA, COMP, PUD. **Attention Abstractor: THIS IS A VA LOAN** **Attention Abstractor: If a PRIVATE ROAD EASEMENT exists, please provide any information and copies along with the abstract.</VendorInstructions> 
               <VendorServices>
                 <TitleVendorService>
                   <TitleVendorServiceId>6615159</TitleVendorServiceId> 
                   <ServiceCode>1OWNER</ServiceCode> 
                   <CustomVendorInstructions><p><b>Copies of recital page, legal description and signature pages of all open mortgages must be provided including copies of the legal description and any riders.<br /> <br /> Copies of assignments must be provided for open liens.<br /> <br /> If the property is registered land a copy of the certificate of title must accompany the search</CustomVendorInstructions> 
                 </TitleVendorService>
              </VendorServices>
           </TitleVendor>
         </TitleVendors>
        </Title>
       </OrderTransaction>
      </OrderTransactions>
      
      
      [XmlArray("OrderTransactions")]
      [XmlArrayItem("OrderTransaction")]
      public List<OrderTransaction> OrderTransactions = new List<OrderTransaction>();
      
              public class OrderTransaction
              {
                  [XmlElement("LoanAmount")]
                  [DataMember]
                  public string LoanAmount { get; set; }
      
                  [XmlArray("Title")]
                  [XmlArrayItem("TitleVendors")]
                  public List<Title> Titles = new List<Title>();
      
                          public class Title
                          {
                              [XmlArray("TitleVendor")]
                              [XmlArrayItem("VendorInstructions")]
                              //[XmlArrayItem("VendorServices")]
                              public List<TitleVendor> TitleVendors = new List<TitleVendor>();
      
                                      public class TitleVendor
                                      {
                                          [XmlElement("VendorInstructions")]
                                          [DataMember]
                                          public string VendorInstructions { get; set; }
      
                                          [XmlArray("VendorServices")]
                                          [XmlArrayItem("TitleVendorService")]
                                          public List<VendorService> VendorServices = new List<VendorService>();
      
                                                  public class VendorService
                                                  {
                                                      public List<TitleVendorService> TitleVendorServices = new List<TitleVendorService>();
      
                                                              public class TitleVendorService
                                                              {
                                                                  [XmlElement("TitleVendorServiceId")]
                                                                  [DataMember]
                                                                  public string TitleVendorServiceId { get; set; }
                                                                  [XmlElement("ServiceCode")]
                                                                  [DataMember]
                                                                  public string ServiceCode { get; set; }
                                                                  [XmlElement("CustomVendorInstructions")]
                                                                  [DataMember]
                                                                  public string CustomVendorInstructions { get; set; }
                                                              }
                                                  }
                                      }
                          }
              }
      

      【讨论】:

        猜你喜欢
        • 2014-10-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多