3

我有一个具有以下结构的 .xml 文件。我想获取特定 EndPointChannelID 的属性值 0.05 等。我目前能够获得该值,但它适用于每个 EndPointChannelID 而不是所需的。另一个转折是读数并不总是 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

你的代码有点太简单了。您需要逐行阅读并首先匹配 EndPointChannelId。设置一个标志以明确表明您具有正确的 ChannelId,然后在满足该条件时读取Value属性。你需要一个数组来保存它们。AnArrayList将是理想的,因为它的长度可变。

于 2013-04-09T17:14:39.307 回答
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 回答