2015-02-03 4 views
1

Я пытаюсь сериализации следующей структуры XML с помощью XmlWriter в C#:C# сериализации в XML с помощью XmlWriter

<userProfiles> 
    <groupId>12345</groupId> 
    <profile> 
    <name>test 1</name> 
    <id>10000</id> 
    <ns:userPerformance> 
     <ns:type>yearly</ns:type> 
     <ns:values>    
      <ns:value> 
      <ns:start>start time</ns:start> 
      <ns:end>end time</ns:end> 
      <ns:value>6712736</ns:value> 
      </ns:value> 
     </ns:values> 
    </ns:userPerformance> 
    </profile> 

    <profile> 
    <name>test 2</name> 
    <id>20000</id> 
    <ns:userPerformance> 
     <ns:type>yearly</ns:type> 
     <ns:values>    
      <ns:value> 
      <ns:start>start time</ns:start> 
      <ns:end>end time</ns:end> 
      <ns:value>712367</ns:value> 
      </ns:value> 
      <ns:value> 
      <ns:start>start time</ns:start> 
      <ns:end>end time</ns:end> 
      <ns:value>54656</ns:value> 
      </ns:value> 
     </ns:values> 
    </ns:userPerformance> 
    </profile> 
</userProfiles> 

Я пытаюсь заполнить элементы userPerformance. Я знаю, что мне нужно итерации между двумя датами для создания значений ns :, но как я могу установить, какой элемент будет начальным элементом, чтобы заполнить значения ns: values? Вот что я до сих пор!

var xml = new XmlTextWriter(new StringWriter()); 

    xml.WriteStartDocument(); 
    xml.WriteStartElement("userProfiles"); 
    xml.WriteElementString("groupId", "1"); 

    foreach (var profile in profiles) 
    { 
     xml.WriteStartElement("profile"); 
     { 
      xml.WriteElementString("name", "test 1"); 
      xml.WriteElementString("id", "10000"); 

      // assume that I have the proper allDays as a List of DateTime 
      foreach(var days in allDays) 
      { 
       // What will be my StartElement? 
       xml.WriteStartElement("userPerformance"); 
      } 
     } 
    } 

Если у меня есть userPerformance как StartElement внутри внутреннего цикла, где я итерацию через дни, я мог бы в конечном итоге, его несколько раз в течение каждого дня. Как я могу избежать этого?

+1

Я рекомендовал бы идти вниз по другому пути: сгенерируйте классы C# из вашего XML (используя xsd.exe), затем создайте свою модель в коде и XML-сериализуйте ее с помощью однострочного интерфейса. См. Http://stackoverflow.com/questions/4203540/generate-c-sharp-class-from-xml –

+0

Нет. Я бы воздержался от использования сгенерированных классов. – sparkr

+0

Какова ваша мотивация? –

ответ

1

Попробуйте это:

xml.WriteStartDocument(); 
xml.WriteStartElement("userProfiles"); 
xml.WriteElementString("groupId", "1"); 

foreach (var profile in profiles) 
{ 
    xml.WriteStartElement("profile"); 
    xml.WriteElementString("name", "test 1"); 
    xml.WriteElementString("id", "10000"); 
    xml.WriteStartElement("userPerformance"); 

    xml.WriteElementString("type", "yearly"); 
    // assume that I have the proper allDays as a List of DateTime 
    foreach (var days in allDays) 
    { 
     // What will be my StartElement? 
     xml.WriteStartElement("values"); 
     xml.WriteElementString("start", DateTime.Now.ToString()); 
     xml.WriteElementString("end", DateTime.Now.ToString()); 
     xml.WriteElementString("value", "0815"); 
     xml.WriteEndElement(); 
    } 
    xml.WriteEndElement(); 
    xml.WriteEndElement(); 
} 

xml.WriteEndElement(); 
0

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

0

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

var userProfiles = new XElement("userProfiles"); 
foreach (var currentProfile in profiles) 
{ 
    var profile = new XElement("profile"); 
    profile.Add(new XElement("name", currentProfile.name)); 
    profile.Add(new XElement("id", currentProfile.id)); 

     var performance = new XElement("performance"); 
     performance.Add(new XElement("type", "yearly")); 

     var values = new XElement("values"); 

     foreach(var days in allDays) 
     { 
      var value = new XElement("value"); 
      value.Add(new XElement("start", days.start)); 
      value.Add(new XElement("end", days.end)); 
      value.Add(new XElement("value", days.value)); 
      values.Add(value); 
     } 

     performance.Add(values); 

     profile.Add(performance); 

    userProfiles.Add(profile); 
} 
+0

Я хочу избежать использования XElement и использовать XmlWriter! – sparkr

+0

userProfiles.Save (YOUR_XMLWRITER_HERE); в соответствии с этой ссылкой: https://msdn.microsoft.com/en-us/library/bb359357%28v=vs.110%29.aspx – Abyte0

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