复杂的XML反序列化

时间:2014-07-23 21:43:39

标签: c# xml class deserialization

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

我的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; }
    }
}

6 个答案:

答案 0 :(得分:3)

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

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

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

  1. 首先,我将您的XML保存到桌面上,名为&#39; sample.xml&#39;
  2. 我以管理员身份打开了VS 2012命令提示符。
  3. 在命令提示符中,我导航到安装SDK的目录。对我来说,它安装在这里(可能与各种OS或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"

  6. 排除注释,这是为您的XML架构自定义生成的CSharp文件。还有其他选项可用于设置命名空间和typename。请查看上面的文章以获取该详细信息。

    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;
        }
    }
    }
    

    希望这有帮助!

答案 1 :(得分: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很可能需要类似的东西。

答案 2 :(得分:1)

由于这仍然是开放的,我以为我会提出一个快速回答,适合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相关的装饰。只有在想要覆盖XmlSerializer的默认选项时才需要XmlElementXmlArray,例如重命名元素或处理具有多态元素的数组。如果您想要清晰起见,可以放置它们,或者防止重新命名属性,但我并不简单。

这是测试设置。我从你的字符串创建一个“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文件和新XML文件的结果:

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

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

答案 3 :(得分:1)

好吧,我不确定你是否想要这个(反序列化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 -> Paste special -> 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();

答案 4 :(得分:0)

Btw XmlSerializer和DataContractSerializer完全不同。根据您的示例,您需要使用XmlSeralizer(而不是DataContractSerializer)。

答案 5 :(得分:0)

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

-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; }
                                                        }
                                            }
                                }
                    }
        }