C# 使用Linq查找值

C# 使用Linq查找值,c#,linq,C#,Linq,我有一个字符串值,如下所示。如何返回引号中包含的所有值。 下面的答案是70116280,05/06/2014 16:31:38等等……基本上答案是列表中引用的所有内容 字符串值 <!-- Capacitor Stack Signoff Record --> <stack_signoff_result lead_traveler="70116280" date="05/06/2014 16:31:38" employee_id="testuser" total_ener

我有一个字符串值,如下所示。如何返回引号中包含的所有值。 下面的答案是70116280,05/06/2014 16:31:38等等……基本上答案是列表中引用的所有内容

字符串值

<!-- Capacitor Stack Signoff Record -->
<stack_signoff_result lead_traveler="70116280" date="05/06/2014 16:31:38" 
    employee_id="testuser" total_energy="77.266345" status="true" 
    operation_mode="Manual" result_detail="NA">
  <signoff_data>
    <adhesive part_number="1234" kanban_number="5678"/>
  </signoff_data>
  <capacitor_set>
    <top_capacitor traveler="45911012" energy="26.000567" capacitance="0.000287553595"/>
    <middle_capacitor traveler="45817588" energy="25.576334" capacitance="0.00028426705"/>
    <bottom_capacitor traveler="45911141" energy="25.689444" capacitance="0.000284239714"/>
  </capacitor_set>
</stack_signoff_result>

我认为最简单的方法是使用XPath查询:

using System.Linq;
using System.Xml.Linq;
using System.Xml.XPath;

...

XDocument document = XDocument.Parse(stringValue);

var xpath = @"//stack_signoff_result[@lead_traveler='70116280']";
var result = from item in document.XPathSelectElements(xpath)
    select item;

foreach (var item in result)
{
    ...
}
更新:要获取所有引用的属性值,可以使用下面的LINQ oneliner(为了可读性,我对其进行了格式化,但您可以将代码展平到一行)

此解决方案不如字符串操作快,但更稳定。例如,如果在代码的谜将是一个引号内的文本节点,你会得到错误的结果

此外,它更容易与您在第一版中编写的搜索任务混合使用:

var result = XDocument
    .Parse(stringValue)
    .XPathSelectElements(@"//stack_signoff_result[@lead_traveler='70116280']")
    .Select(item =>
        string.Join(
            ",",
            item.DescendantsAndSelf()
            .SelectMany(element => element.Attributes())
            .Select(element => element.Value)
        )
    )
;
试试这个:

var result = String.Join("", text.Split('"').Where((x, n) => n % 2 == 1));
我明白了:

7011628005/06/2014 16:31:38testuser77.266345trueManualNA123456784591101226.0005670.0002875535954581758825.5763340.000284267054591114125.6894440.000284239714

问:这是一个好例子吗?我没有看到任何值:我希望看到类似于2014年8月6日的
-date
,而不仅仅是“-date”。无论如何,请看这里:。发回任何特定问题(以及您尝试过的代码)。@FoggyDay再次检查问题。在平板电脑上写问题很难……使用。@user1438082:你甚至从未暗示过你在原来的帖子中使用了XML!谢谢你的更新。如果问题是“在.Net/LINQ中解析XML”,那么System.XML.LINQ和System.XML.XPath就是答案!这里有一篇好文章:。一定要“接受”斯坦下面的回答@FoggyDay表示歉意,我在问题中包含了XML,但由于最初的格式不正确,它没有显示。必须是一行,将引号中包含的所有值返回到列表中。上面的代码已更新。您可以将它与前面的代码混合到一个线性行中,既可以找到所需的XML元素(如问题的第一个版本),也可以格式化所有属性。
7011628005/06/2014 16:31:38testuser77.266345trueManualNA123456784591101226.0005670.0002875535954581758825.5763340.000284267054591114125.6894440.000284239714