-2

私は配列を持っています:

  Device[] dev = new Device[size];
  Sens[] sens = new Sens[size2];
  Channel[] chan = new Channel[size3];
  ...

この配列から LINQ を使用して、このような xml を動的に構築する方法:

<dlx vers="1.0" id="133" type="system_info">
<device software=""....>
   <sens name="" .../>
   <sens name="" ...>
      <chan id="".../>
      <chan id="".../>
   <sens name="" .../>
</device>
<device software=""....>
   <sens name="" .../>
      <chan id="".../>
      <chan id="".../>
      <chan id="".../>
      <chan id="".../>
      <chan id="".../>
   <sens name="" .../>
</device>
...
</dlx>

XElements と XAttributes および LINQ クエリを使用して XML を構築することは、XmlWritter を使用して構築するよりも高速ですか?

4

2 に答える 2

1

次のクラスがあるとします。

public class Device
{
    public string Software { get; set; }
    public IEnumerable<Sens> Sensors { get; set; }
}

public class Sens
{
    public string Name { get; set; }
    public IEnumerable<Channel> Channels { get; set; }
}

public class Channel
{
    public int Id { get; set; }
}

そして、次のデバイスリストがあります

var devices = new List<Device> {
                new Device {
                    Software = "Windows",
                    Sensors = new List<Sens> {
                        new Sens {
                            Name = "Sensor1",
                            Channels = new List<Channel> {
                                new Channel { Id = 1 },
                                new Channel { Id = 2 }
                            }
                        },
                        new Sens {
                            Name = "Sensor2",
                            Channels = new List<Channel> {
                                new Channel { Id = 5 }
                            }
                        }
                    }
                }
            };

XMLの構築は次のようになります

var dlx = new XElement("dlx",
                new XAttribute("vars", "1.0"),
                new XAttribute("id", 133),
                new XAttribute("type", "system_info"),
                from d in devices
                select new XElement("device",
                new XAttribute("software", d.Software),
                from s in d.Sensors
                select new XElement("sens",
                    new XAttribute("name", s.Name),
                    from c in s.Channels
                    select new XElement("chan",
                        new XAttribute("id", c.Id)))));

 dlx.Save(path_to_xml);

これにより、次の xml が生成されます。

<dlx vars="1.0" id="133" type="system_info">
  <device software="Windows">
    <sens name="Sensor1">
      <chan id="1" />
      <chan id="2" />
    </sens>
    <sens name="Sensor2">
      <chan id="5" />
    </sens>
  </device>
</dlx>

XmlWriter を使用した同じコードはより高速に動作しますが、次のようになります。

var settings = new XmlWriterSettings();
settings.Indent = true;
using (XmlWriter writer = XmlWriter.Create("path_to_xml", settings))
{
    writer.WriteStartElement("dlx");
    writer.WriteAttributeString("vars", "1.0");
    writer.WriteAttributeString("id", "133");
    writer.WriteAttributeString("type", "system_info");
    foreach (var d in devices)
    {
        writer.WriteStartElement("device");
        writer.WriteAttributeString("software", d.Software);
        foreach (var s in d.Sensors)
        {
            writer.WriteStartElement("sens");
            writer.WriteAttributeString("name", s.Name);

            foreach (var c in s.Channels)
            {
                writer.WriteStartElement("chan");
                writer.WriteAttributeString("id", c.Id.ToString());
                writer.WriteEndElement();
            }

            writer.WriteEndElement();
        }

        writer.WriteEndElement();
    }
    writer.WriteEndElement();
}

コードをループから別のメソッドに移動することはできますが、それでも読み取りとサポートははるかに困難です。

于 2013-09-26T11:04:13.973 に答える
0

必要な XML 構造を表すクラスを作成し、それを設定する方がよい場合があります。その後、これを非常に簡単に XML ファイルにシリアライズできます。

于 2013-09-26T10:42:02.200 に答える