【问题标题】:How do I extract a value from XML using LINQ?如何使用 LINQ 从 XML 中提取值?
【发布时间】:2014-09-01 23:41:09
【问题描述】:

当您按 UID 搜索时,我试图从以下 XML 中仅返回一个结果:

<Photos>
  <Photo UID="a3d508784ff3456da7bf2ff8ce08e577">
    <Date>2014-08-22T14:00:32.7958436+01:00</Date>
    <File>a3d508784ff3456da7bf2ff8ce08e577.jpg</File>
    <CrimeRef>CR123456/14</CrimeRef>
  </Photo>
  <Photo UID="735620a99f2c4dfd9f2c1870136e993e">
    <Date>2014-08-22T14:07:29.0364635+01:00</Date>
    <File>735620a99f2c4dfd9f2c1870136e993e.jpg</File>
    <CrimeRef>CR999999/99</CrimeRef>
  </Photo>
  <Photo UID="c186993e8a0246c29dd180396dfea47b">
    <Date>2014-08-22T14:07:29.6835282+01:00</Date>
    <File>c186993e8a0246c29dd180396dfea47b.jpg</File>
    <CrimeRef>CR999999/99</CrimeRef>
  </Photo>
</Photos>

我为此使用以下代码:

var fileList = xml.Descendants("Photo")
                  .Where(e => e.Attribute("UID") != null 
                         && (string)e.Attribute("UID").Value == ID)
                  .ToList();

var fileName = fileList[0];

问题在于 fileList[0] 包含整个 XML 元素,而不仅仅是文件名:

有没有办法在 LINQ 中执行相当于 'select File from' 的操作,让我只返回该元素的 'File' 值?我试过这样做没有运气:

var fileName = fileList[0]['File'];

非常感谢

【问题讨论】:

  • Where之后添加.Select(x=&gt;(string)x.Element("File"))
  • 非常感谢 LB!请添加为答案,我会接受:)

标签: c# xml linq


【解决方案1】:

只需添加

.Select(x=>(string)x.Element("File")) 

Where之后

PS:将 XElement 转换为类型更安全,因为即使 File 标签不存在(仅返回 null)也不会引发异常

【讨论】:

    【解决方案2】:

    Select() LINQ 中的File 节点的Value 属性:

    var fileList = xml.Descendants("Photo")
            .Where(e => e.Attribute("UID") != null && (string)e.Attribute("UID").Value == ID)
            .Select(n => n.Element("File").Value)
            .ToList();
    

    【讨论】:

    • 这将返回包含xml标签的元素而不是值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-18
    • 2021-11-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多