2009-05-14 2 views
0

Я пытаюсь создать вывод XML (на основе класса), который выглядит следующим образом:XML выход из класса

<cdsXMLEnvelope> 
<TestValue1>x1</TestValue1> 
    <inner> 
    <eTestValue1>e1</eTestValue1> 
    </inner> 
    <inner> 
    <eTestValue1>e1</eTestValue1> 
    </inner> 
    <inner> 
    <eTestValue1>e1</eTestValue1> 
    </inner> 
</cdsXMLEnvelope> 

[System.Xml.Serialization.XmlRootAttribute("cdsXMLEnvelope", Namespace = "",  IsNullable = false)] 
[XmlTypeAttribute(Namespace = "http://www.w3.org/2001/XMLSchema-instance")] 

//public class cdsXMLEnvelope : cdsXMLinfo 
public class cdsXMLEnvelope 
{ 
    [XmlElementAttribute(ElementName = "eTestValue1")] 
    public string eTestValue1 { get; set; } 

    [System.Xml.Serialization.XmlArrayItem("inner")] 
    public cdsXMLinfo[] cdsXMLinfo { get; set; } 

} 

//[XmlTypeAttribute(Namespace = "http://www.w3.org/2001/XMLSchema-instance")] 
public class cdsXMLinfo 
{ 
    [XmlElementAttribute(ElementName = "TestValue1")] 
    public string TestValue1 { get; set; } 

    [System.Xml.Serialization.XmlAttributeAttribute()] 
    public string TestValue3 { get; set; } 
} 

пожалуйста, помогите мне подключить этот код вверх, изменить класс etc-- Я продолжаю пытаться различными способами & Я получаю объект не найден & ошибки при попытке сериализовать его на xml

также можно избежать использования массива для внутренних элементов? использовать списки?

Постараюсь уточнить этот вопрос, как мы идем, я знаю, что люди ненавидят эти длинные? S

спасибо !!

  { 

       cdsXMLEnvelope x = new cdsXMLEnvelope(); 

       x.eTestValue1 = "x1"; 

       x.cdsXMLinfo = new cdsXMLinfo[1]; 
       x.cdsXMLinfo[0].TestValue1 = "xi1"; 
       //x.cdsXMLinner[0].TestValue1 = "xi2";    

       XmlSerializer writer = new XmlSerializer(x.GetType()); 
       StreamWriter file = new StreamWriter("x.xml"); 

       writer.Serialize(file, x); 
       file.Close(); 

     } 
+0

чем вопрос? – Jeremy

+0

Да? И ваш вопрос? –

+0

, работающий над этим - –

ответ

1

Я думаю, что это дает то, что вы хотите, но ваш пример не вполне последователен:

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

namespace Serialize 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var envelope = new CdsXmlEnvelope 
      { 
       TestValue1 = "x1", 
       InnerList = new List<CdsXmlInfo> 
       { 
        new CdsXmlInfo {TestValue1 = "e1"}, 
        new CdsXmlInfo {TestValue1 = "e1"}, 
        new CdsXmlInfo {TestValue1 = "e1"}, 
       } 
      }; 

      var ns = new XmlSerializerNamespaces(); 
      ns.Add(string.Empty, string.Empty); 

      var serializer = new XmlSerializer(typeof(CdsXmlEnvelope)); 
      using(var stream = new MemoryStream()) 
      { 
       var settings = new XmlWriterSettings(); 
       settings.OmitXmlDeclaration = true; 
       settings.Indent = true; 

       var writer = XmlWriter.Create(stream, settings); 
       serializer.Serialize(writer, envelope, ns); 
       stream.Position = 0; 
       Console.WriteLine(new StreamReader(stream).ReadToEnd()); 
      } 
      Console.ReadLine(); 
     } 
    } 

    [XmlRoot("cdsXMLEnvelope")] 
    public class CdsXmlEnvelope 
    { 
     [XmlElement("TestValue1")] 
     public string TestValue1 { get; set; } 

     [XmlElement("inner")] 
     public List<CdsXmlInfo> InnerList { get; set; } 
    } 

    public class CdsXmlInfo 
    { 
     [XmlElement("TestValue1")] 
     public string TestValue1 { get; set; } 

     [XmlAttribute] 
     public string TestValue3 { get; set; } 
    } 
} 

давая выход:

<cdsXMLEnvelope> 
    <TestValue1>x1</TestValue1> 
    <inner> 
    <TestValue1>e1</TestValue1> 
    </inner> 
    <inner> 
    <TestValue1>e1</TestValue1> 
    </inner> 
    <inner> 
    <TestValue1>e1</TestValue1> 
    </inner> 
</cdsXMLEnvelope> 
+0

, это выглядит идеально, именно то, что я искал ... Я просто не мог, t довольно получить там !! –

0

Если у вас есть схема, вы можете попробовать использовать Xsd.exe для создания C# классы для вас.

+0

Я сделал это, но слишком много kruft, Также важнее, что мне нужна помощь в доступе к фактическому классу (после его правильного) - я хочу, чтобы эти простые кости были просто –

+0

Я знаю, что это звучит странно, но у меня на самом деле были проблемы с использованием автоматических свойств и сериализации XML. Попробуйте переключить их на обычные свойства. Это может быть связано с конструкторами, но я еще не углубился, чтобы понять это. –

+0

ok ... но у меня действительно возникают проблемы с субэлементами. Я действительно получаю xml просто отлично, прежде чем вводить «внутренние» предметы –

Смежные вопросы