3

私は現在、次のようなXMLファイル形式を使用しています(読みやすくするために空白と省略記号が追加されています)。

<root>
    <Module>          //Start with list of Modules
        <ModuleParams>
        </ModuleParams>
    </Module>
    ...

    <DetectLine>      //Now a list of DetectLines
        <DetectLineParams>
        </DetectLineParams>

        <Channels>    //List of Channels embedded in each DetectLine
            <Channel>
                <ChannelParams>
                </ChannelParams>
            </Channel>
            ...

        </Channels>
    </DetectLine>
    ...

</root>

次のように構成されたクラス:

public class Module
{
    public ModuleParams { get; set; }
}

public class DetectLine
{
    public DetectLineParams { get; set; }
    public List<Channel> Channels { get; set; }
}

public class Channel
{
    public ChannelParams { get; set; }
}

モジュールとDetectLineのリストは、LinqtoXMLを使用して簡単に解析できます。ただし、各DetectLineのチャネルリストを解析することは、私にはそれほど明白ではありません。これはLinqtoXMLでも実行できますか?XMLSerializerで動作するように物事を再構築する必要はありません。

初期コード(openXMLはOpenFileDialogです。すでに適切なファイル名がチェックされています):

List<Module> myModules;
List<DetectLine> myDetectLines;
XDocument config = XDocument.Load(openXML.FileName);

myModules =
         (from myElements in config.Descendants("Module")
          select new Module()
          {
              ModuleParam1 = (string)myElements.Element("ModuleParam1"),
              ModuleParam2 = (string)myElements.Element("ModuleParam2"),
              ...
          }).ToList<Module>();

myDetectLines =
          (from myElements in config.Descendants("DetectLine")
           select new DetectLine()
           {
              DetectLineParam1 = (string)myElements.Element("ModuleParam1"),
              DetectLineParam2 = (string)myElements.Element("ModuleParam2"),
              ...

              // ?? Add Channels list here somehow...
           }).ToList<DetectLine>();
4

1 に答える 1

2

XElement detectLine = XElement.Parse(@"<DetectLine>      
        <DetectLineParams>
        </DetectLineParams>

        <Channels>    
            <Channel>
                <ChannelParams>
                </ChannelParams>
            </Channel>
            ...

        </Channels>
    </DetectLine>
");

あなたは例えばすることができます

DetectLine dl1 = new DetectLine() {
  DetectLineParams = ...,
  Channels = (from channel in detectLine.Element("Channels").Element("Channel")
             select new Channel() {
                 ChannelParams = new ChannelParams() { ... = channel.Element("ChannelParams").Value }
             }).ToList();

完全なクエリを設定する方法を詳しく説明するには、具体的なC#クラスコードをもっと見る必要があります。

[編集]あなたが今投稿したコードに合わせるために:

myDetectLines =
          (from myElements in config.Descendants("DetectLine")
           select new DetectLine()
           {
              DetectLineParam1 = (string)myElements.Element("ModuleParam1"),
              DetectLineParam2 = (string)myElements.Element("ModuleParam2"),
              ...

              Channels = (from channel in myElements.Element("Channels").Element("Channel")
                 select new Channel() {
                     ChannelParams = new ChannelParams() { ... = channel.Element("ChannelParams").Value }
                 }).ToList();
           }).ToList<DetectLine>();
于 2012-06-04T16:00:48.240 に答える