从两个节点提取XML值

时间:2014-07-07 23:46:20

标签: c# xml linq-to-xml

我想提取moduleId attibute中的值和Field节点中的值。例如,在第一个节点中,我想从module节点中提取447,从Field节点中提取124694。我在XDocument中加载了XML。最终结果将是一个元组,其中第一个项是moduleId属性的值,第二个项是Field节点的值。有没有办法可以使用一个XLinq语句来做到这一点?

作为奖励......我只想为guid =" 07a188d3-3f8c-4832-8118-f3353cdd1b73"的节点做这件事。这部分我可能会弄清楚是否有人可以告诉我如何从两个节点中提取信息,但是奖励将是为我添加WHERE子句:)

<Records>
    <Record moduleId="447">
        <Field guid="07a188d3-3f8c-4832-8118-f3353cdd1b73">124694</Field>           
    </Record>   
    <Record moduleId="447">
            <Field guid="07a188d3-3f8c-4832-8118-f3353cdd1b73">124699</Field>    
    </Record>
<Records>

我已经使用这个提取字段值...

IEnumerable<string> c = from p in sourceDocument.Descendants("Field")
                        where p.Attribute("guid").Value == "07a188d3-3f8c-4832-8118-f3353cdd1b73"
                        select p.Value;

但我不知道如何从Record节点和Field节点获取信息。

2 个答案:

答案 0 :(得分:2)

尝试一下:

var doc = XDocument.Parse(xml);
var r = doc.Descendants("Record")
    .Where(n => n.Element("Field").Attribute("guid").Value == "07a188d3-3f8c-4832-8118-f3353cdd1b73")
    .Select(n => new { ModuleId = n.Attribute("moduleId").Value, Field = n.Element("Field").Value });

var a = r.ToArray();

答案 1 :(得分:0)

以下是使用 LINQ查询语法

的解决方案
XDocument document = XDocument.Parse(xml);

var query =
    from el in document.Root.Elements("Record")
    where (string)el.Element("Field").Attribute("guid") ==
        "07a188d3-3f8c-4832-8118-f3353cdd1b73"
    select new
    {
        ModuleId = (string)el.Attribute("moduleId"),
        Field = (string)el.Element("Field")
    };

foreach (var item in query)
{
    Console.WriteLine
        ("ModuleId:[{0}]\nField:[{1}]\n--",
             item.ModuleId,
             item.Field);
}