首页 > 解决方案 > LINQ XML 从多个 where 语句中获取元素的值

问题描述

关于SO的第一个问题,如果我搞砸了,请道歉。我是 c# 和 LINQ 的新手,过去 2 天一直在寻找解决方案,但似乎没有一个正是我所追求的。所以...

我正在查询的 xml 文件是从 DICOM 结构化报告文件生成的。我正在尝试从此 xml 文件中获取元素的特定值。这些元素对应于在超声检查期间进行的特定测量。整个 xml 文件有 15k 行长,因此为简单起见,我对其进行了编辑。我将仅展示我正在尝试做的一个示例,但对于我想要获得的所有其他元素,该过程将是相同的。

我想要获得的元素必须满足 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]

任何我可以阅读以解决此问题的文档的帮助或指导将不胜感激。

标签: c#xmllinq

解决方案


尝试以下:

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; }
    }
}

推荐阅读