使用Linq查找值

时间:2014-06-08 06:18:55

标签: 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_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>

2 个答案:

答案 0 :(得分:2)

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

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)
{
    ...
}

UPDATE:要获取所有引用的属性值,可以使用下面的LINQ oneliner(我已将其格式化以便于阅读,但您可以将代码展平为单行)。

var result = string.Join(
    ",",
    XElement
        // Parse xml or can reuse element found in code above
        .Parse(string value)
        // Search in element and all its descendants
        .DescendantsAndSelf()
        // Select all atributtes (quoted values)
        .SelectMany(item => item.Attributes())
        // Select attribute value
        .Select(item => item.Value)
);

此解决方案不如字符串操作快,但更稳定。例如,如果在Enigmativity的代码中将是文本节点内的引号,那么您将得到错误的结果。

此外,您可以更轻松地与第一版中编写的搜索任务混合使用:

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)
        )
    )
;

答案 1 :(得分:1)

试试这个:

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