Сериализация xml различных элементов для нескольких свойств в c # - PullRequest
6 голосов
/ 26 сентября 2011

У меня есть следующий 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 и сохранить существующий путь свойства?

Ответы [ 2 ]

1 голос
/ 26 сентября 2011

Необходимо удалить атрибут XmlArrayItem ().

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

Каждый объект в TableDisplayItems будет field или record-number-field.

Конечно, еслиу вас есть только один record-number-field поверх вашего массива, решение может быть намного лучше.Это так?

0 голосов
/ 27 сентября 2011

Было бы полезно, если бы вы могли дать более подробное описание ваших требований, а затем указать направление вашего подхода. Если вам нужна обычная сериализация / десериализация, попробуйте следующее решение:

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

Надеюсь, это поможет.

...