3

以下の構造の .xml ファイルがあります。特定のEndPointChannelIDの属性値0.05などを取得したいです。現在、値を取得できますが、目的の値ではなく、すべての EndPointChannelID に対するものです。もう 1 つのひねりは、読み取り値が常に 6 になるとは限らないことです。目的の EndPointChannelID からの値のみを保存するにはどうすればよいですか? どんな提案でも大歓迎です!

    <Channel ReadingsInPulse="false">
       <ChannelID EndPointChannelID="5154131" /> 
         <ContiguousIntervalSets>
            <ContiguousIntervalSet NumberOfReadings="6">
               <TimePeriod EndRead="11386.22" EndTime="2013-01-15T02:00:00Z"/> 
                  <Readings>
                     <Reading Value="0.05" /> 
                     <Reading Value="0.04" /> 
                     <Reading Value="0.05" /> 
                     <Reading Value="0.06" /> 
                     <Reading Value="0.03" /> 
                     <Reading Value="0.53" /> 
                  </Readings>
               </ContiguousIntervalSet>
           </ContiguousIntervalSets>
       </Channel>

以下は、値を見つけるために必要な現在のコードです。

        XmlReader reader = XmlReader.Create(FileLocation);
        while (reader.Read())
        {
             if((reader.NodeType == XmlNodeType.Element) && (reader.Name == "Reading"))
             {
                 if (reader.HasAttributes)
                 {
                      MessageBox.Show(reader.GetAttribute("Value"));
                 }
              }
        }
4

3 に答える 3

1

パスを続けるとXMLReader、結果リストを設定し、目的のチャネル ID を待ち、値の収集を開始し、目的のチャネル ID タグが終了したときに値の収集を終了することで、これを行うことができます。

var values = new List<string>();
var collectValues = false;
var desiredChannelId = "5154131";
while (reader.Read())
{
     if((reader.NodeType == XmlNodeType.Element))
     {
         if (reader.Name == "ChannelID" && reader.HasAttributes) {
             collectValues = reader.GetAttribute("EndPointChannelID") == desiredChannelId;
         }
         else if (collectValues && reader.Name == "Reading" && reader.HasAttributes)
         {
              values.Add(reader.GetAttribute("Value"));
         }
      }
}
于 2013-04-09T17:19:16.150 に答える
0

LINQ to XML を使用して簡単に実行できます。

// load document into memory
var xDoc = XDocument.Load("Input.txt");

// query the document and get List<decimal> as result
List<decimal> values = (from ch in xDoc.Root.Elements("Channel")
                        where (int)ch.Element("ChannelID").Attribute("EndPointChannelID") == 5154131
                        from r in ch.Descendants("Reading")
                        select (decimal)r.Attribute("Value")).ToList();
于 2013-04-09T17:15:50.637 に答える
0

あなたのコードは少し単純すぎます。行ごとに読み取り、EndPointChannelId で最初に一致する必要があります。正しい ChannelId を持っていることを明確にするためにフラグを設定し、その条件が満たされたときにValue属性を読み取ります。それらを保存するには配列が必要です。ArrayList可変長であるため、anが理想的です。

于 2013-04-09T17:14:39.307 に答える