c# - 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]
任何我可以阅读以解决此问题的文档的帮助或指导将不胜感激。
解决方案
尝试以下:
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; }
}
}
推荐阅读
- java - 将 `Thread.yield()` 插入同步函数时会发生什么
- imagemagick - 使用 ImageMagick 将 gif 转换为 png 时出现“转换:不正确的图像标题”错误
- ibm-midrange - 如何在不使用 SQL 的情况下从 ILE RPG 中的文件中获取字段的最大值?
- node.js - TypeError:args 的输入类型“String”错误
- java - restcontroller post 方法 405 方法不允许
- android - LRUCache BitmapDrawable
- angular - 来自浏览器桌面通知单击事件的 Angular 6 路由会产生意外行为
- php - 帖子格式视频的存档页面
- text - Autodesk Design Automation API 从 DWG 文件中提取文本
- authentication - Squid 代理上的 NTLM 身份验证