Как получить элемент в атрибуте с помощью LINQ - PullRequest
1 голос
/ 18 июня 2020

Я пытаюсь получить значение элемента, который находится под двумя атрибутами, а затем под другим элементом.

<Setup>
        <Devices>
            <SampleRate>20000</SampleRate>
            <Device Type="AI">
                <Slot Index="0">
                   <OutputChannel>
                    <MeasuredQuantity>VOLTAGE</MeasuredQuantity>
                    <DualCore>True</DualCore>
                   </OutputChannel
                </Slot>
                <Slot Index="1">
                </Slot>
                <Slot Index="2">
                    <OutputChannel>
                    <MeasuredQuantity>VOLTAGE</MeasuredQuantity>
                    <DualCore>True</DualCore>
                   </OutputChannel
                </Slot>
            </Device>
        </Devices>
</Setup>

Как мне go получить измеренное значение?

string typeGage = setupFile.Root.Descendants("DewesoftSetup").Descendants("Devices")
                                .Where(w => w.Element("Device").Attribute("Type").Value == "AI")
                                .Where(w => w.Element("Slot").Attribute("Index").Value == i.ToString())
                                .Select(w => w.Element("MeasuredValue").Value)
                                .Single();

Это вызывает исключение (я предполагаю, что не могу использовать «Где» дважды)

ОБНОВЛЕНИЕ

      for (int i = 0; i < Form1.app.Data.AllChannels.Count; i++)
      {
         found = false;
         IChannel ch = Form1.app.Data.AllChannels[i];

         if (ch.Used == true)
         {
            for (int row = 24; row <= 43; row++)
            {
               if (oSheetLocal.Cells[row, 2].Value == null)
               {
                  string typeGage = setupFile.Root.Descendants("Setup").Descendants("Devices")
                                   .Where(w => w.Element("Device").Attribute("Type").Value == "AI" &&
                                          w.Element("Device").Element("Slot").Attribute("Index").Value == i.ToString())
                                   .Select(w => w.Element("Device").Element("Slot").Element("OutputChannel").Element("MeasuredQuantity").Value)
                                   .FirstOrDefault();
}}}}

Он отлично работает при первом запуске но я пытаюсь получить индекс 2, он возвращает ноль.

1 Ответ

0 голосов
/ 18 июня 2020

Если вы хотите просто Excitation, вы можете использовать:

string excitation = sensorDoc.Root.Descendants("Sensor")
            .Where(w => w.Attribute("ID").Value == sensorSN)
            .Select(w => w.Element("Amplifier").Value)
            .FirstOrDefault();

Обратите внимание, что w => w.Element("Amplifier").Value или w.Element("Amplifier").Element("Excitation").Value заполняют 15 V,
и w => w.Element("Amplifier") заполняют <Amplifier><Excitation>15 V</Excitation </Amplifier .

Если вы хотите DW и 15 V, вы можете использовать:

var calInitialsAndExcitation = sensorDoc.Root.Descendants("Sensor")
                .Where(w => w.Attribute("ID").Value == sensorSN)
                .Select(w => 
                new { 
                        CalInitials = w.Element("CalInitials").Value, 
                        Excitation = w.Element("Amplifier").Element("Excitation").Value
                    }).FirstOrDefault();

UPDATE

string typeGage = setupFile.Root.Descendants("Setup").Descendants("Devices")
            .Where(w => w.Element("Device").Attribute("Type").Value == "AI" 
                && w.Element("Device").Element("Slot").Attribute("Index").Value == "0")
            .Select(w => w.Element("Device").Element("Slot").Element("MeasuredValue").Value)
            .FirstOrDefault();

Обновить согласно комментарию

var typeGage = setupFile.Descendants("Device")
        .Where(d => d.Attribute("Type").Value == "AI")
        .Descendants("Slot")
        .Where(s => s.Attribute("Index").Value == "2")
        .Select(m => m.Element("OutputChannel")?.Element("MeasuredQuantity")?.Value)
        .FirstOrDefault();

Надеюсь, вы найдете это полезным.

...