2

これが私の問題です:

私はこのXMLファイルを持っています:

<?xml version="1.0" encoding="utf-8" ?>
<settings>
  <app name="Application1">
    <log name="Log1" path="d:\paths\" filename="Log1File"/>
    <log name="Log2" path="d:\paths\"/>
    <log name="log3" path="d:\paths\" filename="Log3File"/>
  </app>
</settings>

そして、LINQでそれを読み込んで、このクラスのオブジェクトを作成しようとしています:

  public class Apps
  {
    public string Name { get; set; }
    public IEnumerable<Logs> Logs { get; set; }
  }

  public class Logs
  {
    public string Name { get; set; }
    public string Path { get; set; }
    public string Filename { get; set; }
  }

これまでのところ、このコードを作成することができましたが、最初のログ要素のみを取得するように見えますが、アプリ要素ごとにすべてのログ要素が必要です。

   public static IEnumerable<Apps> GetAllApps()
    {
      var items = from a in db.Descendants("app")
                  orderby a.Attribute("name").Value
                  select new Apps
                  {
                    Name = a.Attribute("name").Value,
                    Logs = from b in a.Descendants("log")
                           select new Logs 
                           { 
                            Name = b.Attribute("name").Value,
                            Path = b.Attribute("path").Value,
                            Filename = b.Attribute("filename").Value
                           }
                  };

      return items;
    }
4

2 に答える 2

3

ここではシリアル化を使用します

XmlSerializer ser = new XmlSerializer(typeof(Settings));
var result = (Settings)ser.Deserialize(stream);

[XmlRoot("settings")]
public class Settings
{
    [XmlElement("app")]
    public Apps[] apps;
}


public class Apps
{
    [XmlAttribute("name")]
    public string Name { get; set; }
    [XmlElement("log")]
    public Logs[] Logs { get; set; }
}

public class Logs
{
    [XmlAttribute("name")]
    public string Name { get; set; }
    [XmlAttribute("path")]
    public string Path { get; set; }
    [XmlAttribute("filename")]
    public string Filename { get; set; }
}
于 2012-06-05T12:49:00.637 に答える
0

流暢な API を使用しましたが、お好みで適応させてください...

xml のログの 1 つに「filename」属性がないため、問題は NullReferenceException です。また、null で「Value」を使用すると、NRE が得られます。

そのため、値を取得する前に属性が存在するかどうかを確認してください。

var it = db.Descendants("app")
                    .OrderBy(app => app.Attribute("name").Value)
                    .Select(app => new Apps() {
                        Name = app.Attribute("name").Value,
                        Logs = app.Descendants("log").Select(a =>
                            new Logs() {
                                Name = a.Attribute("name") != null ? a.Attribute("name").Value : null,
                                Path = a.Attribute("path") != null ? a.Attribute("path").Value : null,
                                Filename = a.Attribute("filename") != null ? a.Attribute("filename").Value : null
                            }).ToList()
                    }).ToList();
于 2012-06-05T12:57:05.017 に答える