Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# LINQ XML从多个where语句获取元素的值_C#_Xml_Linq - Fatal编程技术网

C# LINQ XML从多个where语句获取元素的值

C# LINQ XML从多个where语句获取元素的值,c#,xml,linq,C#,Xml,Linq,第一个问题,如果我把事情搞砸了,我道歉。我是c#和LINQ的新手,在过去的两天里一直在寻找解决方案,似乎没有一个是我想要的。所以 我查询的xml文件是从DICOM结构化报告文件生成的。我试图从这个xml文件中获取元素的特定值。这些元素对应于超声检查期间进行的特定测量。整个xml文件有15k行长,为了简单起见,我对其进行了编辑。我将只展示一个我正在尝试做的例子,但是对于我希望得到的所有其他元素,过程都是一样的 我想要得到的元素必须满足3个标准,在这种情况下,三尖瓣、峰值流速和返流,但这取决于测量结

第一个问题,如果我把事情搞砸了,我道歉。我是c#和LINQ的新手,在过去的两天里一直在寻找解决方案,似乎没有一个是我想要的。所以

我查询的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>
当我运行代码时,我得到以下信息

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; }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Xml;
使用System.Xml.Linq;
命名空间控制台应用程序1
{
班级计划
{
静态void Main(字符串[]参数)
{
XDocument doc=XDocument.Load(“PurchaseOrder.xml”);
列出xContainers=doc.substands(“容器”)。其中(x=>x.Element(“num”)!=null);
列表容器=新列表();
foreach(xContainers中的XElement xContainer)
{
Container newContainer=新容器();
容器。添加(newContainer);
newContainer.code=(字符串)xContainer.substands(“代码”).FirstOrDefault();
newContainer.concept=(字符串)xContainer.subjects(“概念”).FirstOrDefault();
newContainer.value=(int)xContainer.substands(“value”).FirstOrDefault();
newContainer.unit=(字符串)xContainer.substands(“unit”).FirstOrDefault();
}
}
}
公营货柜
{
公共字符串代码{get;set;}
公共字符串概念{get;set;}
公共int值{get;set;}
公共字符串单元{get;set;}
}
}
尝试以下操作:

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; }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Xml;
使用System.Xml.Linq;
命名空间控制台应用程序1
{
班级计划
{
静态void Main(字符串[]参数)
{
XDocument doc=XDocument.Load(“PurchaseOrder.xml”);
列出xContainers=doc.substands(“容器”)。其中(x=>x.Element(“num”)!=null);
列表容器=新列表();
foreach(xContainers中的XElement xContainer)
{
Container newContainer=新容器();
容器。添加(newContainer);
newContainer.code=(字符串)xContainer.substands(“代码”).FirstOrDefault();
newContainer.concept=(字符串)xContainer.subjects(“概念”).FirstOrDefault();
newContainer.value=(int)xContainer.substands(“value”).FirstOrDefault();
newContainer.unit=(字符串)xContainer.substands(“unit”).FirstOrDefault();
}
}
}
公营货柜
{
公共字符串代码{get;set;}
公共字符串概念{get;set;}
公共int值{get;set;}
公共字符串单元{get;set;}
}
}

您得到的是一个尚未执行的枚举数-LINQ表达式的计算是延迟的。您必须迭代枚举数或将其转换为容器类型(例如,
ToList
)才能获得表达式的结果。正如@mrbeanbreman所指出的,请尝试将控制台写入更改为
console.write(“TRVmax:+TRVmax.ToArray())
控制台.Write(“TRVmax:+TRVmax.Count())您得到的是一个尚未执行的枚举数-LINQ表达式被延迟计算。您必须迭代枚举数或将其转换为容器类型(例如,
ToList
)才能获得表达式的结果。正如@mrbeanbreman所指出的,请尝试将控制台写入更改为
console.write(“TRVmax:+TRVmax.ToArray())
控制台.Write(“TRVmax:+TRVmax.Count())