简体   繁体   中英

C# Linq getting value of descendants

I have a question.

Still working on a project, but i am stuck.

We had this code:

    var copyitems = doc.Descendants(application)   // Read all descendants    
        .SelectMany(x => x.Elements("Test"))
        .Select(s =>
        {
            var splits = s.Value.Split(new string[] { "@SRCDIR@", "@INSTDIR@" }, StringSplitOptions.RemoveEmptyEntries); // split the string to separate source and destination.
            return new { Source = splits[0].Replace(",", ""), Destination = splits[1].Replace(",", "") };
        })
        .ToList();

in combination with this xml example:

<root>
<Test>
    <Copy>@SRCDIR@\test1 ,@INSTDIR@\test1</Copy>
</Test>
<root>

But the xml changed to this now:

<root>
<Test>
   <Copy>
        <Source>@SRCDIR@\test</Source>
        <Destination>@INSTDIR@\test1</Destination>
   </Copy>
</Test>
<root>

How can i now do the same, but instead of making a splits just read the info of source and destination.

Also you can have multiple copy descedants and also descedants with other names which don't have the source and destination value

Look for Element method which accepts element name as an input.

var copyitems = doc.Descendants(application)   // Read all descendants    
    .SelectMany(x => x.Elements("Test"))
    .Select(s =>
    {
        return new 
               { 
                     Source = s.Element("Source").Value.Replace("@SRCDIR@", ""),
                     Destination =s.Element("Destination").Value.Replace("@INSTDIR@", "") 
               };
    })
    .ToList();

Your linq query should actually work the same for both Xml (at least the ones shown in your question).

I just tested it

only fixed the invalid </root> , the linq code (I removed application since we don't have that) is exactly the same

If your Xml is different then please show one where your code wouldn't work

Note that element.Value will contain only the non-tags, so for the first Xml you are splitting on: @SRCDIR@\\test1 ,@INSTDIR@\\test2 , and on the second example you are splitting on @SRCDIR@\\test1@INSTDIR@\\test2 , but since the separator is consistent, it just works.

You only have to do a minor change, but still use the Split method. Just add the comma in the separators list.

var separators = new string[] { "@SRCDIR@", "@INSTDIR@", "," };
var tokens = s.Value.Split(separators, StringSplitOptions.RemoveEmptyEntries);
var source = tokens[0];
var destination = tokens[1];

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