Search code examples
c#xmllinqlinq-to-xml

linq issue accessing deep xml data


I'm trying to access xml data that's deep in an xml file with linq. I've been looking at these examples: linq linq

I'm not seeing a good example that doesn't involve names.

mid-question Update:

Ideally, I should be able to access the conditions (1 or 2 usually), and for each condition, to check the Success Criteria against the day's current conditions. So it would provide the buildMachine ProcessName (get filename from that to check against) Conditions (so can iterate/loop over if multiple) path/VersionFile SuccessCriteria (so can loop over if multiple) field=, comparison=, value=

So far I have this code:

string path = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
string newPath = Path.GetFullPath(Path.Combine(path, @"..\.."));
string finalPathXml = Path.GetFullPath(Path.Combine(newPath, @"BuildVerificationBuildAttributes.xml"));

//linq 

    XDocument xmlDoc1 = XDocument.Load(finalPathXml);
    XElement buildVerificationElement = xmlDoc1.Element("BuildVerification");
    IEnumerable<XElement> buildElements = buildVerificationElement.Elements("build");
    IEnumerable<XElement> buildMachines = buildElements.Elements("BuildMachine"); //works. Has build machine and info in it.
    
    //this doesn't work...all empty
    IEnumerable<XElement> processes = buildMachines.Elements("Process");
    IEnumerable<XElement> processNames = processes.Elements("ProcessName");
    IEnumerable<XElement> conditions = processNames.Elements("Conditions");

    foreach (XElement buildMachine in buildMachines)
    {
        //var cond1 = xmlDoc1.Descendants("")
        //foreach condition
      //{
      //path = 
      //for each success criteria
      //{
      //field=
      //comparison=
      //value=
      //}
      //}
      //for each BuildMachine, I need to obtain each condition(s) and it's subsequent dest path,
      // and success criteria/field/comparison/value. Then I can go and see if we meet the 
      //criteria for that machine and case.  I'm having trouble finding how to get those deeper 
      //info in the xml 
}

This is what my xml looks like:

<?xml version="1.0" encoding="UTF-8"?>
<BuildVerification>
    <build>
        <BuildMachine>mach-31</BuildMachine>
            <Process>
                <ProcessName>SpinFileVersionStats</ProcessName>
                    <Conditions>
                        <Condition>
                            <VersionFile>”\\view\Build_NightlyDeveloper\filename.cs”</VersionFile>
                            <SuccessCriteria>
                                <field>Status</field>
                                <comparison>equal</comparison> 
                                <value>Success</value>
                            </SuccessCriteria>
                            **<SuccessCriteria>
                                <field>Status</field>
                                <comparison>equal</comparison> 
                                <value>Success</value>
                            </SuccessCriteria>**
                        </Condition>
                    </Conditions>
            </Process>
            <Process>
                <ProcessName>SpinFileVersionStats</ProcessName>
                    <Conditions>
                        <Condition>
                            <VersionFile>”\\view\Build_NightlyDeveloper\filename2.txt”</VersionFile>

                                <SuccessCriteria>
                                    <field>Status</field>
                                    <comparison>equal</comparison>
                                    <value>Success</value>

                                </SuccessCriteria>
                        </Condition>
                    </Conditions>
            </Process>
            <Process>
                <ProcessName>SpinFileVersionStats</ProcessName>
                    <Conditions>
                        <Condition>
                            <VersionFile>”\\view\Build_NightlyDeveloper\filename.h”</VersionFile>

                            <SuccessCriteria>
                            <field>Status</field>
                            <comparison>equal</comparison>
                            <value>Success</value>

                            </SuccessCriteria>
                        </Condition>
                    </Conditions>
            </Process>

        </build>
        
         <!-- Next -->
        <build>
        <BuildMachine>mach-46</BuildMachine>
            <Process>
                <ProcessName>SpinFileVersionStats</ProcessName>
                    <Conditions>
                        <Condition>
                            <VersionFile>”\\view\Build_NightlyDeveloper\filename.cs”</VersionFile>
                            <SuccessCriteria>
                                <field>Status</field>
                                <comparison>equal</comparison> 
                                <value>Success</value>
                            </SuccessCriteria>
                        </Condition>
                    </Conditions>
            </Process>
            <Process>
                <ProcessName>SpinFileVersionStats</ProcessName>
                    <Conditions>
                        <Condition>
                            <VersionFile>”\\view\Build_NightlyDeveloper\filename.h”</VersionFile>

                                <SuccessCriteria>
                                    <field>Status</field>
                                    <comparison>equal</comparison>
                                    <value>Success</value>

                                </SuccessCriteria>
                        </Condition>
                    </Conditions>
            </Process>
            <Process>
                <ProcessName>SpinFileVersionStats</ProcessName>
                    <Conditions>
                        <Condition>
                            <VersionFile>”\\view\Build_NightlyDeveloper\filename.cs”</VersionFile>

                            <SuccessCriteria>
                            <field>Status</field>
                            <comparison>equal</comparison>
                            <value>Success</value>

                            </SuccessCriteria>
                        </Condition>
                    </Conditions>
            </Process>
            
            <Process>
                <ProcessName>SpinFileVersionStats</ProcessName>
                    <Conditions>
                        <Condition>
                            <VersionFile>”\\view\Build_NightlyDeveloper\filename.cs”</VersionFile>
                            <SuccessCriteria>
                                <field>Status</field>
                                <comparison>equal</comparison> 
                                <value>Success</value>
                            </SuccessCriteria>
                        </Condition>
                    </Conditions>
            </Process>
            <Process>
                <ProcessName>SpinFileVersionStats</ProcessName>
                    <Conditions>
                        <Condition>
                            <VersionFile>”\\view\Build_NightlyDeveloper\filename.cs”</VersionFile>

                                <SuccessCriteria>
                                    <field>Status</field>
                                    <comparison>equal</comparison>
                                    <value>Success</value>

                                </SuccessCriteria>
                        </Condition>
                    </Conditions>
            </Process>
            <Process>
                <ProcessName>SpinFileVersionStats</ProcessName>
                    <Conditions>
                        <Condition>
                            <VersionFile>”\\view\Build_NightlyDeveloper\filename.h”</VersionFile>

                            <SuccessCriteria>
                            <field>Status</field>
                            <comparison>equal</comparison>
                            <value>Success</value>

                            </SuccessCriteria>
                        </Condition>
                    </Conditions>
            </Process>
            
                        
            <Process>
                <ProcessName>SpinFileVersionStats</ProcessName>
                    <Conditions>
                        <Condition>
                            <VersionFile>”\\view\Build_NightlyDeveloper\filename.cs”</VersionFile>
                            <SuccessCriteria>
                                <field>Status</field>
                                <comparison>equal</comparison> 
                                <value>Success</value>
                            </SuccessCriteria>
                        </Condition>
                    </Conditions>
            </Process>
            <Process>
                <ProcessName>SpinFileVersionStats</ProcessName>
                    <Conditions>
                        <Condition>
                            <VersionFile>”\\view\Build_NightlyDeveloper\filename.cs”</VersionFile>

                                <SuccessCriteria>
                                    <field>Status</field>
                                    <comparison>equal</comparison>
                                    <value>Success</value>

                                </SuccessCriteria>
                        </Condition>
                    </Conditions>
            </Process>
            <Process>
                <ProcessName>SpinFileVersionStats</ProcessName>
                    <Conditions>
                        <Condition>
                            <VersionFile>”\\view\Build_NightlyDeveloper\filename.cs”</VersionFile>

                            <SuccessCriteria>
                                <field>Status</field>
                                <comparison>equal</comparison>
                                <value>Success</value>

                            </SuccessCriteria>
                        </Condition>
                    </Conditions>
            </Process>
            
            
            <Process>
                <ProcessName>SpinISProjectVersionStats</ProcessName>
                    <Conditions>
                        <Condition>
                            <ProductName>ABC</ProductName>

                            <SuccessCriteria>
                                <field>Status</field>
                                <comparison>equal</comparison>
                                <value>Success</value>

                            </SuccessCriteria>
                        </Condition>
                    </Conditions>
            </Process>
            <Process>
                <ProcessName>SpinISProjectVersionStats</ProcessName>
                    <Conditions>
                        <Condition>
                            <ProductName>CDE</ProductName>

                            <SuccessCriteria>
                                <field>Status</field>
                                <comparison>equal</comparison>
                                <value>Success</value>

                            </SuccessCriteria>
                        </Condition>
                    </Conditions>
            </Process>
            <Process>
                <ProcessName>SpinISProjectVersionStats</ProcessName>
                    <Conditions>
                        <Condition>
                            <ProductName>EFG</ProductName>

                            <SuccessCriteria>
                                <field>Status</field>
                                <comparison>equal</comparison>
                                <value>Success</value>

                            </SuccessCriteria>
                        </Condition>
                    </Conditions>
            </Process>

        </build>
</BuildVerification>

Update2: My attempt using the response method below, with my changes to get first and last, and how to access what I get out of the xml with a variable is below. What would I do if I had 3 Processes or 3 SuccessCriteria?

var results = xmlDoc1.Descendants("build")
    .SelectMany(x => x.Descendants("Process")
    .Select(y => new
    {
        Build_Machine = (string)x.Element("BuildMachine"),
        Process_Name1 = (string)y.Descendants("ProcessName").FirstOrDefault(),
        Process_Name2 = (string)y.Descendants("ProcessName").Last(),
        VersionFile = (string)y.Descendants("VersionFile").FirstOrDefault(),
        Field1 = (string)y.Descendants("field").FirstOrDefault(),
        Comparison1 = (string)y.Descendants("comparison").FirstOrDefault(),
        Value1 = (string)y.Descendants("value").FirstOrDefault(),
        Field2 = (string)y.Descendants("field").Last(),
        Comparison2 = (string)y.Descendants("comparison").Last(),
        Value2 = (string)y.Descendants("value").Last()
    })).ToList();
foreach (var cur in results)
{
    string buildMach = (string)cur.Build_Machine;
    string p1 = (string)cur.Process_Name1;
    string p2 = (string)cur.Process_Name2;
    string verFile = (string)cur.VersionFile;
    string f1 = (string)cur.Field1;
    string f2 = (string)cur.Field2;
    string c1 = (string)cur.Comparison1;
    string c2 = (string)cur.Comparison2;
    string v1 = (string)cur.Value1;
    string v2 = (string)cur.Value2;
}

Solution

  • Try following :

    using System;
    using System.Linq;
    using System.Collections.Generic;
    using System.Data;
    using System.Xml;
    using System.Xml.Linq;
    using System.Text;
    
    namespace ConsoleApp10
    {
    
        class Program
        {
            static string FILENAME = @"c:\temp\test.xml";
            static void Main(string[] args)
            {
                XDocument doc = XDocument.Load(FILENAME);
                var results = doc.Descendants("build")
                    .SelectMany(x => x.Descendants("Process")
                    .SelectMany(y => y.Descendants("SuccessCriteria")
                    .Select(z =>  new
                    {
                        Build_Machine = (string)x.Element("BuildMachine"),
                        Process_Name = (string)y.Element("ProcessName"),
                        VersionFile = (string)y.Descendants("VersionFile").FirstOrDefault(),
                        Field = (string)z.Element("field"),
                        Comparison = (string)z.Element("comparison"),
                        Value = (string)z.Element("value")
                    }))).ToList();
     
            }
     
    
        }
    
    }
    

    Results

    enter image description here