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# 在一条语句中从Xml文档中选择多个值_C#_Xml_Linq_Linq To Xml - Fatal编程技术网

C# 在一条语句中从Xml文档中选择多个值

C# 在一条语句中从Xml文档中选择多个值,c#,xml,linq,linq-to-xml,C#,Xml,Linq,Linq To Xml,我试图同时使用 var values = xDoc.Element("root") .Elements("model") .Where(x => x.Element("modelName").Value == modelType.ToString()) .Elements("directory") .Select(x => new {

我试图同时使用

var values =
            xDoc.Element("root")
                .Elements("model")
                .Where(x => x.Element("modelName").Value == modelType.ToString())
                .Elements("directory")
                .Select(x => new { x.Element("directoryName").Value,
                               x.Element("taskName").Value });
我在
.Value
s下面看到红色的曲线,上面写着“复制匿名类型属性名'Value'。 这是xml

    <root>
  <model>
    <modelName>Model1</modelName>
    <directory>
      <directoryName>Dir1</directoryName>
      <taskName>Task1</taskName>
    </directory>
  </model>
  <model>
    <modelName>Model2</modelName>
    <directory>
      <directoryName>FirstValue</directoryName>
      <taskName>SecondValue</taskName>
    </directory>
  </model>
</root>

模型1
Dir1
任务1
模型2
第一价值
第二价值

我想提取Dir1和Task1或FirstValue和SecondValue。

解决了这个问题,您只需要在匿名类型中命名属性

var values =
            xDoc.Element("root")
                .Elements("model")
                .Where(x => x.Element("modelName").Value == modelType.ToString())
                .Elements("directory")
                .Select(x => new { Directory = x.Element("directoryName").Value,
                                   Task = x.Element("taskName").Value });

我建议您使用强制转换元素来字符串,而不是访问它们的
属性。因为如果缺少元素(例如对于
Model1
您没有
taskName
元素),那么您将得到
NullReferenceException

var values = from m in xDoc.Root.Elements("model")
             where (string)m.Element("modelName") == modelType.ToString()
             let d = m.Element("directory")
             select new {
                Directory = (string)d.Element("directoryName"),
                Task = (string)d.Element("taskName")
             };
此外,我发现声明性(查询)语法比lambda语法更具可读性(品味问题)。您还可以使用XPath使查询更加紧凑:

string xpath = String.Format("root/model[modelName='{0}']/directory", modelType);
var values = from d in xdoc.XPathSelectElements(xpath)
             select new {
                 Directory = (string)d.Element("directoryName"),
                 Task = (string)d.Element("taskName")
             };

@reggaeguitar您的代码对您提供的示例xml引发异常。请使用
modelType=“Model1”
尝试该方法,您必须为模型类型提供枚举,例如modelType.Model2,它将在ToString()上变成字符串“Model2”call.我刚刚为xDoc.Root属性填写了xml.+1,我没有意识到这一点。@reggaeguitar谢谢!顺便说一句,我添加了xpath示例,您可能会感兴趣,它非常酷!我通过了单元测试,并以优异的成绩通过了测试。