【问题标题】:Serialize xml different elements to several properties in c#将xml不同的元素序列化为c#中的几个属性
【发布时间】:2011-09-26 15:56:38
【问题描述】:

我有下一个 xml:

<table-display-fields>
  <field name="NAME/>
  <field name="DESCRIPTION" />
</table-display-fields>

我用下一个代码取消了它:

[XmlArray("table-display-fields")]
[XmlArrayItem("field")]
public TableDisplayField[] TableDisplayFields;

然后我将新的 xml 元素添加到 table-display-fields 节点:

<table-display-fields>
  <record-number-field name="ID" />
  <field name="NAME/>
  <field name="DESCRIPTION" />
</table-display-fields>

然后添加下一个代码以取消实现记录号字段:

[XmlArray("table-display-fields")]
[XmlArrayItem("record-number-field")]
public TableDisplayField[] RecordTableDisplayFields;

[XmlArray("table-display-fields")]
[XmlArrayItem("field")]
public TableDisplayField[] TableDisplayFields;

这不起作用。如何取消实现新的 xml,并保存现有的属性路径?

【问题讨论】:

  • 这不起作用?究竟会发生什么?
  • 我有下一个异常:System.Web.HttpUnhandledException (0x80004005):抛出了“System.Web.HttpUnhandledException”类型的异常。 ---> System.InvalidOperationException:反映类型“TableDisplayConfiguration”的错误。 ---> System.InvalidOperationException:反映字段“TableDisplayFields”时出现错误。 ---> System.InvalidOperationException:来自命名空间“localhost/configuration/application”的 XML 元素“table-display-fields”已经存在于当前范围内。使用 XML 属性为元素指定另一个 XML 名称或命名空间。

标签: c# xml deserialization


【解决方案1】:

您必须删除 XmlArrayItem() 属性。

[XmlArray("table-display-fields")] 
public object[] TableDisplayItems;

TableDisplayItems 中的每个对象都将是 fieldrecord-number-field

当然,如果您的阵列顶部只有一个 record-number-field,则解决方案会更好。是这样吗?

【讨论】:

  • 是的。我需要单独的记录号字段和字段元素。
【解决方案2】:

如果您可以更详细地描述您的要求,然后说明您的方法的方向,这将有所帮助。如果您正在寻找正常的序列化/反序列化,则可以尝试以下解决方案:

using System.Collections.Generic;
using System.Xml.Serialization;

namespace Serialization01 {
    [XmlRoot( "table-display-fields" )]
    public class TableDisplayFields {
        [XmlElement( "record-number-field" )]
        public string RecordNumberField { get; set; }

        [XmlElement( "field" )]
        public List<string> FieldName { get; set; }

        public TableDisplayFields ( ) {
            FieldName = new List<string>( 5 );
        }
    }
}

并使用以下代码写入和读取序列化数据:

using System.IO;
using System.Xml.Serialization;
using System;

namespace Serialization01 {
    class Program {
        static void Main ( string [] args ) {
            // Initiate the class
            TableDisplayFields t = new TableDisplayFields( );

            t.RecordNumberField = "ID";
            t.FieldName.Add( "NAME" );
            t.FieldName.Add( "DESCRIPTION" );

            TextWriter tw = new StreamWriter( Path.Combine( Environment.CurrentDirectory, "Data.xml" ) );

            XmlSerializer xs = new XmlSerializer( t.GetType( ) );

            xs.Serialize( tw, t );

            tw.Flush( );
            tw.Close( );

            TextReader tr = new StreamReader( Path.Combine( Environment.CurrentDirectory, "Data.xml" ) );
            TableDisplayFields t2 = xs.Deserialize( tr ) as TableDisplayFields;

            Console.WriteLine( "RecordNumberField for t2 is {0}", t2.RecordNumberField );
            foreach ( string field in t2.FieldName ) {
                Console.WriteLine( "Found field '{0}'", field );
            }
        }
    }
}

希望对您有所帮助。

【讨论】:

  • 谢谢,但这不是我真正想看到的。这是一个简单的解决方案,但需要重构现有代码。
猜你喜欢
  • 2012-07-05
  • 1970-01-01
  • 1970-01-01
  • 2017-11-07
  • 2018-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-13
相关资源
最近更新 更多