Getting attribute from xml and printing it error

24 Views Asked by At

I'm trying to retrieve attribute values from my xml using c# and linq. The attribute data is blank when I print it. Any help would be greatly appreciated. Other than retrieving the attribute values, it gets the rest of the xml perfectly. After I get the xml once it's fixed, I will be checking it against log values for the daily build to determine success.

I looked at these links:

attribute retrieve value xml value any depth

This is my results followed by code retrieving all of the xml. Note that there are varying conditions and processes inside 2-10 build tags, and 1-3 SuccessCriteria tags:

results (note name and loc are not retrieving correctly so print blank:

build_machine='mach-46', process_name='SpinFileVersionStats', name='', loc='',field='Status', comparison='equal', value='Success'
build_machine='mach-46', process_name='SpinFileVersionStats', name='', loc='',field='Status', comparison='equal', value='Success'
build_machine='mach-46', process_name='SpinFileVersionStats', name='', loc='',field='Status', comparison='equal', value='Success'
build_machine='mach-46', process_name='SpinFileVersionStats', name='', loc='',field='Status', comparison='equal', value='Success'
build_machine='mach-46', process_name='SpinFileVersionStats', name='', loc='',field='Status', comparison='equal', value='Success'
build_machine='mach-46', process_name='SpinFileVersionStats', name='', loc='',field='Status', comparison='equal', value='Success'
build_machine='mach-46', process_name='SpinFileVersionStats', name='', loc='',field='Status', comparison='equal', value='Success'
build_machine='mach-46', process_name='SpinFileVersionStats', name='', loc='',field='Status', comparison='equal', value='Success'
build_machine='mach-46', process_name='SpinFileVersionStats', name='', loc='',field='Status', comparison='equal', value='Success'
build_machine='mach-46', process_name='SpinISProjectVersionStats', name='', loc='',field='Status', comparison='equal', value='Success'
build_machine='mach-46', process_name='SpinISProjectVersionStats', name='', loc='',field='Status', comparison='equal', value='Success'
build_machine='mach-46', process_name='SpinISProjectVersionStats', name='', loc='',field='Status', comparison='equal', value='Success'
build_machine='mach-64', process_name='BuildLogStats', name='', loc='',field='Status', comparison='equal', value='Success'
build_machine='mach-64', process_name='CopyAlgorithmRepositoryBuildStats', name='', loc='',field='Status', comparison='equal', value='Success'
build_machine='mach-64', process_name='GetSWStats', name='', loc='',field='UpdateRequired', comparison='equal', value='YES'
build_machine='mach-64', process_name='GetSWStats', name='', loc='',field='Status', comparison='equal', value='Successful'

code:

XmlDocument xml = new XmlDocument();
string path = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
string newPath = Path.GetFullPath(Path.Combine(path, @"..\.."));
string finalPathXml = Path.GetFullPath(Path.Combine(newPath, @"new3.xml"));
var results = xmlDoc1.Descendants("build")
    .SelectMany(x => x.Descendants("Process")
    .SelectMany(y => y.Descendants("SuccessCriteria")
    .Select(z => new
    {
        Build_Machine = (string)x.Element("BuildMachine"),
        Process_Name1 = (string)y.Element("ProcessName"),
        Name = (string)y.Attribute("name"),
        Val = (string)y.Attribute("value"),
        Field1 = (string)z.Element("field"),
        Comparison1 = (string)z.Element("comparison"),
        Value1 = (string)z.Element("value")
    }))).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 name = (string)cur.Name;
    string value = (string)cur.Val;
    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;
    Console.WriteLine("build_machine='{0}', process_name='{1}', name='{2}', loc='{3}',field='{4}', comparison='{5}', value='{6}'", buildMach, p1, name,value,f1,c1,v1);

}

xml:

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

                                </SuccessCriteria>
                        </Condition>
                    </Conditions>
            </Process>
            <Process>
                <ProcessName>SpinFileVersionStats</ProcessName>
                    <Conditions>
                        <Condition
                            name='VersionFile' value="\\view\Build_NightlyDeveloper\filename.cs">

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

                            </SuccessCriteria>
                        </Condition>
                    </Conditions>
            </Process>
            
            <Process>
                <ProcessName>SpinFileVersionStats</ProcessName>
                    <Conditions>
                        <Condition
                            name='VersionFile' value="\\view\Build_NightlyDeveloper\filename2.cs">
                            <SuccessCriteria>
                                <field>Status</field>
                                <comparison>equal</comparison> 
                                <value>Success</value>
                            </SuccessCriteria>
                        </Condition>
                    </Conditions>
            </Process>
            <Process>
                <ProcessName>SpinFileVersionStats</ProcessName>
                    <Conditions>
                        <Condition
                            name='VersionFile' value="\\view\Build_NightlyDeveloper\filename3.cs">

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

                                </SuccessCriteria>
                        </Condition>
                    </Conditions>
            </Process>
            <Process>
                <ProcessName>SpinFileVersionStats</ProcessName>
                    <Conditions>
                        <Condition
                            name='VersionFile' value="\\view\Build_NightlyDeveloper\filename4.h">

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

                            </SuccessCriteria>
                        </Condition>
                    </Conditions>
            </Process>
            
                        
            <Process>
                <ProcessName>SpinFileVersionStats</ProcessName>
                    <Conditions>
                        <Condition
                            name='VersionFile' value="\\view\Build_NightlyDeveloper\filename5.cs">
                            <SuccessCriteria>
                                <field>Status</field>
                                <comparison>equal</comparison> 
                                <value>Success</value>
                            </SuccessCriteria>
                        </Condition>
                    </Conditions>
            </Process>
            <Process>
                <ProcessName>SpinFileVersionStats</ProcessName>
                    <Conditions>
                        <Condition
                            name='VersionFile' value="\\view\Build_NightlyDeveloper\filename6.cs">

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

                                </SuccessCriteria>
                        </Condition>
                    </Conditions>
            </Process>
            <Process>
                <ProcessName>SpinFileVersionStats</ProcessName>
                    <Conditions>
                        <Condition
                            name='VersionFile' value="\\view\Build_NightlyDeveloper\filename7.cs">

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

                            </SuccessCriteria>
                        </Condition>
                    </Conditions>
            </Process>
            
            
            <Process>
                <ProcessName>SpinISProjectVersionStats</ProcessName>
                    <Conditions>
                        <Condition
                            name='ProductName' value="123">

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

                            </SuccessCriteria>
                        </Condition>
                    </Conditions>
            </Process>
            <Process>
                <ProcessName>SpinISProjectVersionStats</ProcessName>
                    <Conditions>
                        <Condition
                            name='ProductName' value="345">

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

                            </SuccessCriteria>
                        </Condition>
                    </Conditions>
            </Process>
            <Process>
                <ProcessName>SpinISProjectVersionStats</ProcessName>
                    <Conditions>
                        <Condition
                            name='ProductName' value="abc">

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

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

        </build>
<build>
        <BuildMachine>mach-64</BuildMachine>
            <Process>
                <ProcessName>BuildLogStats</ProcessName>
                    <Conditions>
                        <Condition
                            name='BuildArea' value="D:\Retail\nightly_VS17">
                            <SuccessCriteria>
                                <field>Status</field>
                                <comparison>equal</comparison> 
                                <value>Success</value>
                            </SuccessCriteria>
                        </Condition>
                    </Conditions>
            </Process>
            <Process>
                <ProcessName>CopyAlgorithmRepositoryBuildStats</ProcessName>
                    <Conditions>
                        <Condition
                            name='Destination' value="D:\Retail\nightly_VS17\Retail\bin">

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

                                </SuccessCriteria>
                        </Condition>
                    </Conditions>
            </Process>
            <Process>
                <ProcessName>GetSWStats</ProcessName>
                    <Conditions>
                        <Condition
                            name='DestinationPath' value="D:\Retail\nightly_VS17">

                            <SuccessCriteria>
                                <field>UpdateRequired</field>
                                <comparison>equal</comparison>
                                <value>YES</value>

                            </SuccessCriteria>
                        </Condition>
                        <Condition
                            name='DestinationPath' value="D:\Retail\nightly_VS17">

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

                            </SuccessCriteria>
                        </Condition>
                    </Conditions>
            </Process>
      </build>
</BuildVerification>
1

There are 1 best solutions below

0
jdweng On BEST ANSWER

I updated my code from last posting. You do not need to cast to string in foreach because all items are already string.

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 xDoc = XDocument.Load(FILENAME);
            var results = xDoc.Descendants("build")
                .SelectMany(x => x.Descendants("Process")
                .SelectMany(y => y.Descendants("SuccessCriteria")
                .Select(z => new
                {
                    buildMach = (string)x.Element("BuildMachine"),
                    p1 = (string)y.Element("ProcessName"),
                    name = (string)y.Attribute("name"),
                    value = (string)y.Attribute("value"),
                    cName = (string)x.Descendants("Condition").FirstOrDefault().Attribute("name"),
                    cValue = (string)x.Descendants("Condition").FirstOrDefault().Attribute("value"),
                    f1 = (string)z.Element("field"),
                    c1 = (string)z.Element("comparison"),
                    v1 = (string)z.Element("value")
                }))).ToList();
            foreach (var cur in results)
            {
                Console.WriteLine("build_machine='{0}', process_name='{1}', name='{2}', loc='{3}', condition name='{4}', condition value = '{5}', field='{6}', comparison='{7}', value='{8}'", 
                    cur.buildMach, cur.p1, cur.name, cur.value, cur.cName, cur.cValue, cur.f1, cur.c1, cur.v1);

            }
        }
    }

}