2011-09-26 2 views
6

Tôi có xml tiếp theo:Serialize xml yếu tố khác nhau đến một số tài sản trong C#

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

tôi deserealize rằng với mã tiếp theo:

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

Sau đó, tôi thêm yếu tố xml mới cho bảng hiển thị-lĩnh vực nút:

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

Sau đó thêm mã tiếp theo để khử hồ sơ số trường:

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

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

Điều này không hiệu quả. Làm cách nào để loại bỏ xml mới và lưu đường dẫn thuộc tính hiện tại?

+0

Tính năng này không hoạt động? Chính xác thì điều gì xảy ra? –

+0

Tôi có ngoại lệ tiếp theo: System.Web.HttpUnhandledException (0x80004005): Ngoại lệ loại 'System.Web.HttpUnhandledException' đã bị ném. ---> System.InvalidOperationException: Đã xảy ra lỗi khi phản ánh loại 'TableDisplayConfiguration'. ---> System.InvalidOperationException: Đã xảy ra lỗi khi phản ánh trường 'TableDisplayFields'. ---> System.InvalidOperationException: Thành phần XML 'table-display-fields' từ không gian tên 'http: // localhost/configuration/application' đã có mặt trong phạm vi hiện tại. Sử dụng các thuộc tính XML để chỉ định một tên hoặc không gian tên XML khác cho phần tử. – tbicr

Trả lời

1

Bạn phải xóa thuộc tính XmlArrayItem().

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

Mỗi đối tượng trong TableDisplayItems sẽ hoặc là một field hoặc một record-number-field.

Tất nhiên, nếu bạn chỉ có một duy nhất record-number-field ở trên cùng của mảng, giải pháp có thể đẹp hơn nhiều. Có phải vậy không?

+0

Vâng. Tôi cần các phần tử trường và trường số bản ghi riêng biệt. – tbicr

0

Sẽ giúp ích nếu bạn có thể mô tả chi tiết hơn về yêu cầu của mình và sau đó là hướng tiếp cận của bạn. Nếu một serializing bình thường/deserializing là những gì bạn đang tìm kiếm bạn có thể thử các giải pháp dưới đây:

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

và sử dụng mã dưới đây để viết và đọc dữ liệu tuần tự:

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

Hy vọng rằng sẽ giúp.

+0

Cảm ơn, nhưng đây không phải là tôi thực sự muốn xem. Đây là giải pháp đơn giản nhưng yêu cầu tái cấu trúc mã hiện có. – tbicr