簡體   English   中英

使用XmlWriter將C#序列化為XML

[英]C# Serialization to XML using XmlWriter

我正在嘗試使用C#中的XmlWriter序列化為以下XML結構:

<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:values,但是如何設置哪個元素作為開始元素,以便填充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,則可能最終每天要多次使用它。 我該如何避免呢?

嘗試這個:

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

我認為XML中的序列與調用WriteStartElement的序列相同。 因此,我認為您需要按照希望它們在XML中出現的方式對allDays進行排序。

另一種方法可能是這樣:(此代碼是一個示例,可能無法編譯)

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM