LINQ XML Получить значение элемента из нескольких операторов where - PullRequest
1 голос
/ 22 апреля 2020

Первый вопрос о SO, извиняюсь, если я что-то испортил. Я новичок в c# и LINQ и потратил последние 2 дня на поиски SO, чтобы найти решение, ни один из них, похоже, не является тем, к чему я стремлюсь. Итак ...

Файл xml, который я запрашиваю, генерируется из файла структурированного отчета DICOM. Я пытаюсь получить указанные c значения элементов из этого xml файла. Эти элементы соответствуют конкретным c измерениям, которые были сделаны во время ультразвукового исследования. Весь файл xml имеет длину 15 тыс. Строк, поэтому для простоты я его отредактировал. Я просто покажу один пример того, что я пытаюсь сделать, но процесс будет одинаковым для всех остальных элементов, которые я хочу получить.

Элемент, который я хочу получить, должен соответствовать 3 критериям в этом случае Трикуспидальный клапан , Пиковая скорость и Регургитантный поток , но это изменяется в зависимости от того, какое измерение было выполнено. Как только эти критерии будут выполнены, я хочу получить значение, которое в данном случае равно 2120.

xml

<report type="Comprehensive SR">
   <document>
      <content>
         <container flag="SEPARATE">
          <container flag="SEPARATE">
               <code>
                  <meaning>Tricuspid Valve</meaning>
               </code>
               <container flag="SEPARATE">
                  <num>
                     <concept>
                        <meaning>Peak Velocity</meaning>
                     </concept>
                     <code>
                        <meaning>Regurgitant Flow</meaning>
                     </code>
                     <value>2120</value>
                     <unit>
                        <value>mm/s</value>
                     </unit>
                  </num>

Мой код в c#

XDocument xmlSR = XDocument.Load("DICOMSRtest.xml");
var TRVmax = from c in xmlSR.Descendants("container")
        where (string)c.Element("code").Element("meaning") == "Tricuspid Valve"
        where (string)c.Element("concept").Element("meaning") == "Peak Velocity"
        where (string)c.Element("code").Element("meaning") == "Regurgitant Flow"
        select c.Element("container").Element("num").Element("value");

        Console.Write("TRVmax: " + TRVmax);

Когда я запускаю код, я получаю следующее

TRVmax: System.Linq.Enumerable+WhereSelectEnumerableIterator`2[System.Xml.Linq.XElement,System.Xml.Linq.XElement]

Любая помощь или указание к какой-либо документации, которую я могу прочитать, чтобы решить эту проблему, будет принята с благодарностью.

1 Ответ

0 голосов
/ 22 апреля 2020

Попробуйте следующее:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load("PurchaseOrder.xml");

            List<XElement> xContainers = doc.Descendants("container").Where(x => x.Element("num") != null).ToList();

            List<Container> containers = new List<Container>();
            foreach (XElement xContainer in xContainers)
            {
                Container newContainer = new Container();
                containers.Add(newContainer);
                newContainer.code = (string)xContainer.Descendants("code").FirstOrDefault();
                newContainer.concept = (string)xContainer.Descendants("concept").FirstOrDefault();
                newContainer.value = (int)xContainer.Descendants("value").FirstOrDefault();
                newContainer.unit = (string)xContainer.Descendants("unit").FirstOrDefault();
            }


        }
    }
    public class Container
    {
        public string code { get; set; }
        public string concept { get; set; }
        public int value { get; set; }
        public string unit { get; set; }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...