简体   繁体   中英

Extracting XML values from two nodes

I want to extract the value in the moduleId attibute and the value from the Field node. For example, in this first node I want to extract the 447 in the moduleId and the 124694 from the Field node. I have the XML loaded in an XDocument. The end result will be a Tuple where the first item is the value from the moduleId attribute and the second item is the value from the Field node. Is there a way I can do this using one XLinq statement?

As a bonus...I only want to do it for nodes where the guid = "07a188d3-3f8c-4832-8118-f3353cdd1b73". This part I can probably figure out if someone can tell me how to extract information from two nodes, but a bonus would be to add the WHERE clause in there for me :)

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

I have gotten as far as extracting the Field value using this...

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

But I have no idea how to get information from both the Record node and the Field node.

Give this a try:

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

Here is a solution that uses LINQ Query Syntax:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM