2011-09-26 10 views
6

मैं अगले एक्सएमएल है:को क्रमानुसार एक्सएमएल विभिन्न तत्वों

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

मुझे लगता है कि अगले कोड के साथ deserealize:

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

तब मैं नए एक्सएमएल तत्व तालिका-प्रदर्शन क्षेत्रों में जोड़ने नोड:

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

फिर deserealize को रिकार्ड संख्या मैदान अगले कोड जोड़ें:

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

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

यह काम नहीं करता है। मैं नए एक्सएमएल को कैसे अचयनित कर सकता हूं, और मौजूदा प्रॉपर्टी पथ को कैसे सहेज सकता हूं?

+0

यह काम नहीं करता है? वास्तव में क्या होता है? –

+0

मेरे पास अगला अपवाद है: सिस्टम.Web.HttpUnhandledException (0x80004005): प्रकार 'System.Web.HttpUnhandledException' की अपवाद फेंक दी गई थी। ---> System.InvalidOperationException: 'TableDisplay कॉन्फ़िगरेशन' प्रकार को प्रतिबिंबित करने में त्रुटि हुई थी। ---> System.InvalidOperationException: फ़ील्ड 'TableDisplayFields' को प्रतिबिंबित करने में त्रुटि हुई थी। ---> System.InvalidOperationException: नामस्थान 'http: // localhost/config/application' से XML तत्व 'तालिका-प्रदर्शन-फ़ील्ड' वर्तमान दायरे में पहले से मौजूद है। तत्व के लिए एक और एक्सएमएल नाम या नामस्थान निर्दिष्ट करने के लिए एक्सएमएल विशेषताओं का प्रयोग करें। – tbicr

उत्तर

1

आपको XmlArrayItem() विशेषता को हटाना होगा।

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

TableDisplayItems में प्रत्येक वस्तु या तो एक field या एक record-number-field हो जाएगा।

बेशक, अगर आपके पास केवल एक ही record-number-field आपके सरणी के शीर्ष पर है, तो समाधान बहुत अच्छा हो सकता है। क्या यह मामला है?

+0

हां यह है। मुझे अलग-अलग रिकॉर्ड-संख्या-फ़ील्ड और फील्ड तत्वों की आवश्यकता है। – tbicr

0

यदि आप अपनी आवश्यकता पर और फिर अपने दृष्टिकोण की दिशा में अधिक विस्तृत विवरण दे सकते हैं तो इससे मदद मिलेगी।

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

आशा है कि मदद करता है, तो एक सामान्य serializing/deserializing क्या आप आप नीचे दिए गए समाधान की कोशिश कर सकते के लिए देख रहे है।

+0

धन्यवाद, लेकिन ऐसा नहीं है कि मैं वास्तव में देखना चाहता हूं। यह सरल समाधान है लेकिन मौजूदा कोड के रिफैक्टरिंग की आवश्यकता है। – tbicr

संबंधित मुद्दे