当多个条件时如何根据文件检查 linq/xml?

问题描述 投票:0回答:1

我有一个项目,它读取每个构建区域的预期构建结果的 xml,并与构建日志进行比较以查看构建是否通过。现在,linq 在单独的结果行中显示每个条件,但是(因为我循环遍历每个 linq 结果行以检查是否成功)我需要能够在同一时间,而不是不同时间。否则我可能会检查日志文件的错误行。请注意,有时有两个成功标准,但并非总是如此。这只是我需要立即检查的两个条件。

我的问题是,如何同时检查这两个条件?例如,对于某些日志,ParseISLogStats,我放入 xml 中的表看起来像这样(因此我需要检查日志中的 BuildProject 和 BaseBuildArea 是否正确,因为它们是不同的列,但成功标准对于这两个来说只有一个条件):

ParseISLogStats    BuildProject=DInstallerBuild   BaseBuildArea=D:\R\K\v2.1\nightly   Status=Success
ParseISLogStats    BuildProject=KInstallerBuild   BaseBuildArea=D:\R\K\v2.1\nightly   Status=Success
ParseISLogStats    BuildProject=IInstallerBuild   BaseBuildArea=D:\R\K\v2.1\nightly   Status=Success

我正在检查的日志文件如下所示:

StartTime           EndTime             Day Elapsed     sec Status  BuildProj       Desc  Projects  FailedProj  Errors  Warnings  FailedProjList  BaseBuildArea  LogFile  AdditionalInfo
04/16/24 21:57:31   04/16/24 22:02:46   Tue 00:05:15    315 Success DInstallerBuild K v2.1 nightly  16  0   0   20      D:\R_Builds\K\v2.1\nightly  X:\D\Build\Installers\DInstallerBuild.log   
04/16/24 22:06:53   04/16/24 22:18:20   Tue 00:11:27    687 Success KInstallerBuild K v2.1 nightly  9   0   0   19      D:\R_Builds\K\v2.1\nightly  X:\K\Build\Installers\KInstallerBuild.log   
04/16/24 22:26:43   04/16/24 22:29:32   Tue 00:02:49    169 Success KInstallerBuild K v2.1 nightly  2   0   0   5       D:\R_Builds\K\v2.1\nightly  X:\K\Build\Installers\KInstallerBuild.log   
04/17/24 00:19:00   04/17/24 00:24:00   Wed 00:05:00    300 Success Incremental_v2.1    v2.1 Incremental Installer Builds   5   0   0   8       D:\R_Builds\K\v2.1\nightly  I:\Logs\IncrementalInstallBuildLog_v2.1.txt

我一直在看这些例子: linq linq

我的代码中的 linq 正在检索如下所示的内容:

19:00
build_machine='mach31', process_name='SpinFileVersionStats', condition name='VersionFile', condition value = '\\view\Build_NightlyDeveloper\R\filename1.cs', field='Status', comparison='equal', value='Success'
build_machine='mach31', process_name='SpinFileVersionStats', condition name='VersionFile', condition value = '\\view\Build_NightlyDeveloper\R\filename2.cs', field='Status', comparison='equal', value='Success'
build_machine='mach31', process_name='SpinFileVersionStats', condition name='VersionFile', condition value = '\\view\Build_NightlyDeveloper\R\filename3.h', field='Status', comparison='equal', value='Success'
build_machine='mach46', process_name='SpinFileVersionStats', condition name='VersionFile', condition value = '\\view\Build_NightlyDeveloper\K\filename4.cs', field='Status', comparison='equal', value='Success'
build_machine='mach46', process_name='SpinFileVersionStats', condition name='VersionFile', condition value = '\\view\Build_NightlyDeveloper\K\fiename5.h', field='Status', comparison='equal', value='Success'
build_machine='mach46', process_name='SpinFileVersionStats', condition name='VersionFile', condition value = '\\view\Build_NightlyDeveloper\K\filename6.cs', field='Status', comparison='equal', value='Success'
build_machine='mach46', process_name='SpinFileVersionStats', condition name='VersionFile', condition value = '\\view\Build_NightlyDeveloper\D\filename7.cs', field='Status', comparison='equal', value='Success'
build_machine='mach46', process_name='SpinFileVersionStats', condition name='VersionFile', condition value = '\\view\Build_NightlyDeveloper\K\K\filename8.cs', field='Status', comparison='equal', value='Success'
build_machine='mach46', process_name='SpinFileVersionStats', condition name='VersionFile', condition value = '\\view\Build_NightlyDeveloper\K\K\filename9.h', field='Status', comparison='equal', value='Success'
build_machine='mach46', process_name='SpinFileVersionStats', condition name='VersionFile', condition value = '\\view\Build_NightlyDeveloper\K\K\filename11.cs', field='Status', comparison='equal', value='Success'
build_machine='mach46', process_name='SpinFileVersionStats', condition name='VersionFile', condition value = '\\view\Build_NightlyDeveloper\K\filename22.cs', field='Status', comparison='equal', value='Success'
build_machine='mach46', process_name='SpinFileVersionStats', condition name='VersionFile', condition value = '\\view\Build_NightlyDeveloper\K\filename33.cs', field='Status', comparison='equal', value='Success'
build_machine='mach46', process_name='SpinISProjectVersionStats', condition name='ProductName', condition value = 'P1', field='Status', comparison='equal', value='Success'
build_machine='mach46', process_name='SpinISProjectVersionStats', condition name='ProductName', condition value = 'P2', field='Status', comparison='equal', value='Success'
build_machine='mach46', process_name='SpinISProjectVersionStats', condition name='ProductName', condition value = 'P3', field='Status', comparison='equal', value='Success'
build_machine='mach46', process_name='GetSWStats', condition name='DestinationPath', condition value = 'D:\Builds\Retail\nightly', field='UpdateRequired', comparison='equal', value='YES'
build_machine='mach46', process_name='GetSWStats', condition name='DestinationPath', condition value = 'D:\Builds\Retail\nightly', field='Status', comparison='equal', value='Successful'
build_machine='mach46', process_name='ParseISLogStats', condition name='BuildProject', condition value = 'RetailInstallerBuild', field='Projects', comparison='equal', value='33'
build_machine='mach46', process_name='ParseISLogStats', condition name='BuildProject', condition value = 'RetailInstallerBuild', field='Projects', comparison='equal', value='8'
build_machine='mach46', process_name='ParseISLogStats', condition name='BuildProject', condition value = 'RetailInstallerBuild', field='Status', comparison='equal', value='Success'
build_machine='mach46', process_name='ParseISLogStats', condition name='BuildProject', condition value = 'DInstallerBuild', field='Status', comparison='equal', value='Success'
build_machine='mach46', process_name='ParseISLogStats', condition name='BaseBuildArea', condition value = 'D:\R_Builds\K\v2.1\nightly', field='Status', comparison='equal', value='Success'
build_machine='mach46', process_name='ParseISLogStats', condition name='BuildProject', condition value = 'KInstallerBuild', field='Status', comparison='equal', value='Success'
build_machine='mach46', process_name='ParseISLogStats', condition name='BaseBuildArea', condition value = 'D:\R_Builds\K\v2.1\nightly', field='Status', comparison='equal', value='Success'
build_machine='mach46', process_name='ParseISLogStats', condition name='BuildProject', condition value = 'KInstallerBuild', field='Status', comparison='equal', value='Success'
build_machine='mach46', process_name='ParseISLogStats', condition name='BaseBuildArea', condition value = 'D:\R_Builds\K\v2.1\nightly', field='Status', comparison='equal', value='Success'
build_machine='mach46', process_name='ParseISLogStats', condition name='BuildProject', condition value = 'Incremental_v2.1', field='Status', comparison='equal', value='Success'
build_machine='mach46', process_name='ParseISLogStats', condition name='BaseBuildArea', condition value = 'D:\RP_Builds\KPEX\v24.1\nightly', field='Status', comparison='equal', value='Success'
build_machine='mach46', process_name='UpdateBuildArea-Stats', condition name='DestPath', condition value = '\\mach62\Builds\nightly', field='Dir', comparison='equal', value='Retail'
build_machine='mach46', process_name='UpdateBuildArea-Stats', condition name='DestPath', condition value = '\\mach62\Builds\nightly', field='eSecs', comparison='greaterThan', value='0'

到目前为止我有这个代码:

        void ReadXml()
    {
        int i_results = 0; //0 is successful for all; if it increases we have failed in one
        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, @"BuildVerificationBuildAttributes_t.xml"));

        //linq 
        XDocument xmlDoc1 = XDocument.Load(finalPathXml);
        XElement buildVerificationElement = xmlDoc1.Element("BuildVerification");
        IEnumerable<XElement> buildElements = buildVerificationElement.Elements("build");
        IEnumerable<XElement> buildMachines = buildElements.Elements("BuildMachine");

        //get just the times from the xml
        var codeFreezeTime = xmlDoc1.Descendants("codeFreezeTime").First()?.Value;
        Console.WriteLine(codeFreezeTime);

        IEnumerable<XElement> processes = buildMachines.Elements("Process");
        IEnumerable<XElement> processNames = processes.Elements("ProcessName");
        IEnumerable<XElement> conditions = processNames.Elements("Conditions");
        var found = xmlDoc1.XPathEvaluate("/BuildVerification/build/BuildMachine/Process/ProcessName/Conditions") as IEnumerable<object>;

        var results =
            xmlDoc1.Descendants("build")
            .SelectMany(b => b.Descendants("Process")
            .SelectMany(p => p.Descendants("Condition")
            .SelectMany(c =>c.Descendants("SuccessCriteria")
            .Select(sc => new
            {
                buildMach = (string)b.Element("BuildMachine"),
                p1 = (string)p.Element("ProcessName"),
                startTimeHeader = (string)p.Element("startTimeHeader"),
                cName = (string)c.Attribute("name"),
                cValue = (string)c.Attribute("value"),
                f1 = (string)sc.Element("field"),
                c1 = (string)sc.Element("comparison"),
                v1 = (string)sc.Element("value")
            })))).ToList();
        foreach (var cur in results)
        {
            Console.WriteLine("build_machine='{0}', process_name='{1}', condition name='{2}', condition value = '{3}', field='{4}', comparison='{5}', value='{6}'",
                cur.buildMach, cur.p1, cur.cName, cur.cValue, cur.f1, cur.c1, cur.v1);

            
            i_results += ParseLogFile(codeFreezeTime, cur.startTimeHeader, cur.buildMach, cur.p1, cur.cName, cur.cValue, cur.f1, cur.c1, cur.v1);
        }

        if(i_results > 0)
            Console.WriteLine("Build has failed this many times:{0} ", i_results);
    }

从 linq 获取信息的代码是这样的,但是很长,但我只显示第一部分:

int ParseLogFile(string codeFreezeTime, string startTimeHeader, string serverName, string logName, string cName, string cValue, string field1, string comparison1, string val)
{
    //bool b_results = false; //failed

    bool b_foundResultWhenExpected = false;
    int i_results = 0; //add 1 for each fail
    //path to file to read and parse
    string serverPath = @"\\\\" + serverName;
    string logNameFull = logName + ".txt";
    string partialPath = "";

    string combinedPath2 = partialPath + logNameFull;
    Uri serverUri = new Uri(serverPath + combinedPath2);
    string finalPath = serverUri.LocalPath;

    DateTime today = DateTime.Today;
    string s_today = today.ToString("MM/dd/yyyy");
    DateTime yesterday = DateTime.Today.AddDays(-1); //code freeze day is day before run check
    DateTime dayBeforeYesterday = DateTime.Today.AddDays(-2); //for SpinFile logs we use any time after previous code freeze
    string yesterdayDate = (yesterday).ToString("MM/dd/yyyy");
    string dayBeforeYesterdayDate = (dayBeforeYesterday).ToString("MM/dd/yyyy");
    string yesterdayDateWithTime = yesterdayDate + " " + codeFreezeTime;
    string dayBeforeYesterdayDateWithTime = dayBeforeYesterdayDate + " " + codeFreezeTime;
    CultureInfo provider = CultureInfo.CurrentCulture;
    DateTime yesterdayDateTime = DateTime.ParseExact(yesterdayDateWithTime, "MM/dd/yyyy HH:mm", provider);
    DateTime DayBeforeYesterdayDateTime = DateTime.ParseExact(dayBeforeYesterdayDateWithTime, "MM/dd/yyyy HH:mm", provider);

    // Read file content into a DataTable using delimiters
    DataTable dataTable = ReadDataTable(finalPath);

    foreach (DataRow row in dataTable.Rows)
    {
        if (Regex.IsMatch((row[startTimeHeader]).ToString(), @"^\d+")) //date starts with number..filter out rows that have general logging instead of dated table entries
        {

                string tmpStartDT = ((row[startTimeHeader]).ToString()).Trim(); //in case extra spaces for date string

                tmpStartDT = tmpStartDT.Replace("  ", " "); //take care of datetime that have two spaces between date and time, which is an error
                                                            //using H and not HH because military time (capital H), and this handles 0:01 and 05:01 and 14:01 (one H)
                if (((logName.Contains("Spin")) && (startDate > DayBeforeYesterdayDateTime)) || (startDate > yesterdayDateTime))
                {
                   if (((string)row[cName]).Replace("\\", "") == (cValue).Replace("\\", "")) //put this after date check
                   {
                     float left = 0, right = 0;
                     string mostRecentComparison = row[field1].ToString();
                     switch (comparison1)
                     {
                        case "equal":
                                if (mostRecentComparison == val) //pass/success
                                {
                                    Console.WriteLine(serverName + " " + logName + " " + cName + " " + cValue + " " + field1 + " " + comparison1 + " " + mostRecentComparison + " Perfect!");
                                }
                                else if (logName == "GetSWStats")
                                {
                                    if (val == "UpToDate")
                                    {
                                        Console.WriteLine(serverName + " " + logName + " " + cName + " " + cValue + " " + field1 + " " + comparison1 + " " + mostRecentComparison + "Which is ok");

                                    }
                                }
                                else //fail
                                {   //check for retries
                                    if (!peekAheadToSeeIfSuccessWhenInFailure(dataTable, (debug_i - 1), cValue, cName, field1, comparison1, val)) //it never retries successfully
                                    {
                                        Console.WriteLine(serverName + " " + logName + " " + cName + " " + cValue + " " + field1 + " " + mostRecentComparison + " " + " does not " + comparison1 + " " + val + " Found: " + mostRecentComparison + " Error! *****"); //show value of row, not xml val
                                        i_results++;
                                    }
                                }
                                break;
                            ...
                  }//valid time
            }//foreach

} //ParseLogFile

这就是我的 xml 的样子:

<?xml version="1.0" encoding="UTF-8"?>
<BuildVerification>
    <codeFreezeTime>19:00</codeFreezeTime>
    <build>
        <BuildMachine>mach31</BuildMachine>
            <Process>
                <ProcessName>SpinFileVersionStats</ProcessName>
                <startTimeHeader>StartTime</startTimeHeader>
                    <Conditions>
                        <Condition
                            name='VersionFile' value="\\view\Build_NightlyDeveloper\R\filename1.cs">
                            <SuccessCriteria>
                                <field>Status</field>
                                <comparison>equal</comparison> 
                                <value>Success</value>
                            </SuccessCriteria>
                        </Condition>
                    </Conditions>
            </Process>
            <Process>
                <ProcessName>SpinFileVersionStats</ProcessName>
                <startTimeHeader>StartTime</startTimeHeader>
                    <Conditions>
                        <Condition
                            name='VersionFile' value="\\view\Build_NightlyDeveloper\R\filename2.cs">
                                <SuccessCriteria>
                                    <field>Status</field>
                                    <comparison>equal</comparison>
                                    <value>Success</value>

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

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

        </build>
        
        
        <build>
        <BuildMachine>mach46</BuildMachine>
            <Process>
                <ProcessName>SpinFileVersionStats</ProcessName>
                <startTimeHeader>StartTime</startTimeHeader>
                    <Conditions>
                        <Condition
                            name='VersionFile' value="\\view\Build_NightlyDeveloper\K\filename4.cs">
                            <SuccessCriteria>
                                <field>Status</field>
                                <comparison>equal</comparison> 
                                <value>Success</value>
                            </SuccessCriteria>
                        </Condition>
                    </Conditions>
            </Process>
            <Process>
                <ProcessName>SpinFileVersionStats</ProcessName>
                <startTimeHeader>StartTime</startTimeHeader>
                    <Conditions>
                        <Condition
                            name='VersionFile' value="\\view\Build_NightlyDeveloper\K\fiename5.h">
                                <SuccessCriteria>
                                    <field>Status</field>
                                    <comparison>equal</comparison>
                                    <value>Success</value>

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

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

                            </SuccessCriteria>
                        </Condition>
                    </Conditions>
            </Process>
            
            <Process>
                <ProcessName>SpinFileVersionStats</ProcessName>
                <startTimeHeader>StartTime</startTimeHeader>
                    <Conditions>
                        <Condition
                            name='VersionFile' value="\\view\Build_NightlyDeveloper\D\filename7.cs">
                            <SuccessCriteria>
                                <field>Status</field>
                                <comparison>equal</comparison> 
                                <value>Success</value>
                            </SuccessCriteria>
                        </Condition>
                    </Conditions>
            </Process>
            <Process>
                <ProcessName>SpinFileVersionStats</ProcessName>
                <startTimeHeader>StartTime</startTimeHeader>
                    <Conditions>
                        <Condition
                            name='VersionFile' value="\\view\Build_NightlyDeveloper\K\K\filename8.cs">

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

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

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

                            </SuccessCriteria>
                        </Condition>
                    </Conditions>
            </Process>
            
                        
            <Process>
                <ProcessName>SpinFileVersionStats</ProcessName>
                <startTimeHeader>StartTime</startTimeHeader>
                    <Conditions>
                        <Condition
                            name='VersionFile' value="\\view\Build_NightlyDeveloper\K\K\filename11.cs">
                            <SuccessCriteria>
                                <field>Status</field>
                                <comparison>equal</comparison> <!--can't use >= here -->
                                <value>Success</value>
                            </SuccessCriteria>
                        </Condition>
                    </Conditions>
            </Process>
            <Process>
                <ProcessName>SpinFileVersionStats</ProcessName>
                <startTimeHeader>StartTime</startTimeHeader>
                    <Conditions>
                        <Condition
                            name='VersionFile' value="\\view\Build_NightlyDeveloper\K\filename22.cs">

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

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

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

                            </SuccessCriteria>
                        </Condition>
                    </Conditions>
            </Process>
            
            
            <Process>
                <ProcessName>SpinISProjectVersionStats</ProcessName>
                <startTimeHeader>StartTime</startTimeHeader>
                    <Conditions>
                        <Condition
                            name='ProductName' value="P1">

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

                            </SuccessCriteria>
                        </Condition>
                    </Conditions>
            </Process>
            <Process>
                <ProcessName>SpinISProjectVersionStats</ProcessName>
                <startTimeHeader>StartTime</startTimeHeader>
                    <Conditions>
                        <Condition
                            name='ProductName' value="P2">

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

                            </SuccessCriteria>
                        </Condition>
                    </Conditions>
            </Process>
            <Process>
                <ProcessName>SpinISProjectVersionStats</ProcessName>
                <startTimeHeader>StartTime</startTimeHeader>
                    <Conditions>
                        <Condition
                            name='ProductName' value="P3">

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

                            </SuccessCriteria>
                        </Condition>
                    </Conditions>
            </Process>
            <Process>
                <ProcessName>GetSWStats</ProcessName>
                <startTimeHeader>StartTime</startTimeHeader>
                    <Conditions>
                        <Condition
                            name='DestinationPath' value="D:\Builds\Retail\nightly">

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

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

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

                            </SuccessCriteria>
                        </Condition>
                    </Conditions>
            </Process>
            
            <Process>
                <ProcessName>ParseISLogStats</ProcessName>
                <startTimeHeader>StartTime</startTimeHeader>
                    <Conditions>
                        <Condition
                            name='BuildProject' value="RetailInstallerBuild">
                            <SuccessCriteria>
                                <field>Projects</field>
                                <comparison>equal</comparison> 
                                <value>33</value>
                            </SuccessCriteria>
                        </Condition>
                        <Condition
                            name='BuildProject' value="RetailInstallerBuild">
                            <SuccessCriteria>
                                <field>Projects</field>
                                <comparison>equal</comparison> 
                                <value>8</value>
                            </SuccessCriteria>
                            <SuccessCriteria>
                                <field>Status</field>
                                <comparison>equal</comparison> 
                                <value>Success</value>
                            </SuccessCriteria>
                        </Condition>
                    </Conditions>
            </Process>
            <Process>
                <ProcessName>ParseISLogStats</ProcessName>
                <startTimeHeader>StartTime</startTimeHeader>
                    <Conditions>
                        <Condition
                            name='BuildProject' value="DInstallerBuild">
                            <SuccessCriteria>
                                <field>Status</field>
                                <comparison>equal</comparison> 
                                <value>Success</value>
                            </SuccessCriteria>
                        </Condition>
                        <Condition
                            name='BaseBuildArea' value="D:\R_Builds\K\v2.1\nightly">
                            <SuccessCriteria>
                                <field>Status</field>
                                <comparison>equal</comparison> 
                                <value>Success</value>
                            </SuccessCriteria>
                        </Condition>
                    </Conditions>
            </Process>
            <Process>
                <ProcessName>ParseISLogStats</ProcessName>
                <startTimeHeader>StartTime</startTimeHeader>
                    <Conditions>
                        <Condition
                            name='BuildProject' value="KInstallerBuild">
                            <SuccessCriteria>
                                <field>Status</field>
                                <comparison>equal</comparison> 
                                <value>Success</value>
                            </SuccessCriteria>
                        </Condition>
                        <Condition
                            name='BaseBuildArea' value="D:\R_Builds\K\v2.1\nightly">
                            <SuccessCriteria>
                                <field>Status</field>
                                <comparison>equal</comparison> 
                                <value>Success</value>
                            </SuccessCriteria>
                        </Condition>
                        </Conditions>
            </Process>
            <Process>
                <ProcessName>ParseISLogStats</ProcessName>
                <startTimeHeader>StartTime</startTimeHeader>
                    <Conditions>
                        <Condition
                            name='BuildProject' value="KInstallerBuild">
                            <SuccessCriteria>
                                <field>Status</field>
                                <comparison>equal</comparison> 
                                <value>Success</value>
                            </SuccessCriteria>
                        </Condition>
                        <Condition
                            name='BaseBuildArea' value="D:\R_Builds\K\v2.1\nightly">
                            <SuccessCriteria>
                                <field>Status</field>
                                <comparison>equal</comparison> 
                                <value>Success</value>
                            </SuccessCriteria>
                        </Condition>
                    </Conditions>
            </Process>
            <Process>
                <ProcessName>ParseISLogStats</ProcessName>
                <startTimeHeader>StartTime</startTimeHeader>
                    <Conditions>
                        <Condition
                            name='BuildProject' value="Incremental_v2.1">
                            <SuccessCriteria>
                                <field>Status</field>
                                <comparison>equal</comparison> 
                                <value>Success</value>
                            </SuccessCriteria>
                        </Condition>
                        <Condition
                            name='BaseBuildArea' value="D:\RP_Builds\KPEX\v24.1\nightly">
                            <SuccessCriteria>
                                <field>Status</field>
                                <comparison>equal</comparison> 
                                <value>Success</value>
                            </SuccessCriteria>
                        </Condition>
                    </Conditions>
            </Process>
            <Process>
                <ProcessName>UpdateBuildArea-Stats</ProcessName>
                <startTimeHeader>StartTime</startTimeHeader>
                    <Conditions>
                        <Condition
                            name='DestPath' value="\\mach62\Builds\nightly">

                                <SuccessCriteria>
                                    <field>Dir</field>
                                    <comparison>equal</comparison>
                                    <value>Retail</value>

                                </SuccessCriteria>
                        </Condition>
                        <Condition
                            name='DestPath' value="\\mach62\Builds\nightly">

                                <SuccessCriteria>
                                    <field>eSecs</field>
                                    <comparison>greaterThan</comparison>
                                    <value>0</value>

                                </SuccessCriteria>
                        </Condition>
                    </Conditions>
            </Process>
        </build>
    </BuildVerification>
c# linq datatable
1个回答
0
投票

为什么这么复杂。您可以创建一个类,然后序列化为 XML,这是将 xml 反序列化为类以及将类反序列化为 xml 的示例 所以如果你创建/填充类 来自查询并在几行代码中序列化。不需要手动构建xml


void Main()
{
    BuildVerification test  = new BuildVerification();  
    string xml = "<BuildVerification><codeFreezeTime>19:00</codeFreezeTime><build><BuildMachine>mach31</BuildMachine><Process><ProcessName>SpinFileVersionStats</ProcessName><startTimeHeader>StartTime</startTimeHeader><Conditions><Condition name=\"VersionFile\" value=\"\\view\\Build_NightlyDeveloper\\R\\filename1.cs\"><SuccessCriteria><field>Status</field><comparison>equal</comparison><value>Success</value></SuccessCriteria></Condition></Conditions></Process><Process><ProcessName>SpinFileVersionStats</ProcessName><startTimeHeader>StartTime</startTimeHeader><Conditions><Condition name=\"VersionFile\" value=\"\\view\\Build_NightlyDeveloper\\R\\filename2.cs\"><SuccessCriteria><field>Status</field><comparison>equal</comparison><value>Success</value></SuccessCriteria></Condition></Conditions></Process><Process><ProcessName>SpinFileVersionStats</ProcessName><startTimeHeader>StartTime</startTimeHeader><Conditions><Condition name=\"VersionFile\" value=\"\\view\\Build_NightlyDeveloper\\R\\filename3.h\"><SuccessCriteria><field>Status</field><comparison>equal</comparison><value>Success</value></SuccessCriteria></Condition></Conditions></Process></build><build><BuildMachine>mach46</BuildMachine><Process><ProcessName>SpinFileVersionStats</ProcessName><startTimeHeader>StartTime</startTimeHeader><Conditions><Condition name=\"VersionFile\" value=\"\\view\\Build_NightlyDeveloper\\K\\filename4.cs\"><SuccessCriteria><field>Status</field><comparison>equal</comparison><value>Success</value></SuccessCriteria></Condition></Conditions></Process><Process><ProcessName>SpinFileVersionStats</ProcessName><startTimeHeader>StartTime</startTimeHeader><Conditions><Condition name=\"VersionFile\" value=\"\\view\\Build_NightlyDeveloper\\K\\fiename5.h\"><SuccessCriteria><field>Status</field><comparison>equal</comparison><value>Success</value></SuccessCriteria></Condition></Conditions></Process><Process><ProcessName>SpinFileVersionStats</ProcessName><startTimeHeader>StartTime</startTimeHeader><Conditions><Condition name=\"VersionFile\" value=\"\\view\\Build_NightlyDeveloper\\K\\filename6.cs\"><SuccessCriteria><field>Status</field><comparison>equal</comparison><value>Success</value></SuccessCriteria></Condition></Conditions></Process><Process><ProcessName>SpinFileVersionStats</ProcessName><startTimeHeader>StartTime</startTimeHeader><Conditions><Condition name=\"VersionFile\" value=\"\\view\\Build_NightlyDeveloper\\D\\filename7.cs\"><SuccessCriteria><field>Status</field><comparison>equal</comparison><value>Success</value></SuccessCriteria></Condition></Conditions></Process><Process><ProcessName>SpinFileVersionStats</ProcessName><startTimeHeader>StartTime</startTimeHeader><Conditions><Condition name=\"VersionFile\" value=\"\\view\\Build_NightlyDeveloper\\K\\K\\filename8.cs\"><SuccessCriteria><field>Status</field><comparison>equal</comparison><value>Success</value></SuccessCriteria></Condition></Conditions></Process><Process><ProcessName>SpinFileVersionStats</ProcessName><startTimeHeader>StartTime</startTimeHeader><Conditions><Condition name=\"VersionFile\" value=\"\\view\\Build_NightlyDeveloper\\K\\K\\filename9.h\"><SuccessCriteria><field>Status</field><comparison>equal</comparison><value>Success</value></SuccessCriteria></Condition></Conditions></Process><Process><ProcessName>SpinFileVersionStats</ProcessName><startTimeHeader>StartTime</startTimeHeader><Conditions><Condition name=\"VersionFile\" value=\"\\view\\Build_NightlyDeveloper\\K\\K\\filename11.cs\"><SuccessCriteria><field>Status</field><comparison>equal</comparison><!--can\"t use >= here --><value>Success</value></SuccessCriteria></Condition></Conditions></Process><Process><ProcessName>SpinFileVersionStats</ProcessName><startTimeHeader>StartTime</startTimeHeader><Conditions><Condition name=\"VersionFile\" value=\"\\view\\Build_NightlyDeveloper\\K\\filename22.cs\"><SuccessCriteria><field>Status</field><comparison>equal</comparison><value>Success</value></SuccessCriteria></Condition></Conditions></Process><Process><ProcessName>SpinFileVersionStats</ProcessName><startTimeHeader>StartTime</startTimeHeader><Conditions><Condition name=\"VersionFile\" value=\"\\view\\Build_NightlyDeveloper\\K\\filename33.cs\"><SuccessCriteria><field>Status</field><comparison>equal</comparison><value>Success</value></SuccessCriteria></Condition></Conditions></Process><Process><ProcessName>SpinISProjectVersionStats</ProcessName><startTimeHeader>StartTime</startTimeHeader><Conditions><Condition name=\"ProductName\" value=\"P1\"><SuccessCriteria><field>Status</field><comparison>equal</comparison><value>Success</value></SuccessCriteria></Condition></Conditions></Process><Process><ProcessName>SpinISProjectVersionStats</ProcessName><startTimeHeader>StartTime</startTimeHeader><Conditions><Condition name=\"ProductName\" value=\"P2\"><SuccessCriteria><field>Status</field><comparison>equal</comparison><value>Success</value></SuccessCriteria></Condition></Conditions></Process><Process><ProcessName>SpinISProjectVersionStats</ProcessName><startTimeHeader>StartTime</startTimeHeader><Conditions><Condition name=\"ProductName\" value=\"P3\"><SuccessCriteria><field>Status</field><comparison>equal</comparison><value>Success</value></SuccessCriteria></Condition></Conditions></Process><Process><ProcessName>GetSWStats</ProcessName><startTimeHeader>StartTime</startTimeHeader><Conditions><Condition name=\"DestinationPath\" value=\"D:\\Builds\\Retail\\nightly\"><SuccessCriteria><field>UpdateRequired</field><comparison>equal</comparison><value>YES</value></SuccessCriteria></Condition><Condition name=\"DestinationPath\" value=\"D:\\Builds\\Retail\\nightly\"><SuccessCriteria><field>Status</field><comparison>equal</comparison><value>Successful</value></SuccessCriteria></Condition></Conditions></Process><Process><ProcessName>ParseISLogStats</ProcessName><startTimeHeader>StartTime</startTimeHeader><Conditions><Condition name=\"BuildProject\" value=\"RetailInstallerBuild\"><SuccessCriteria><field>Projects</field><comparison>equal</comparison><value>33</value></SuccessCriteria></Condition><Condition name=\"BuildProject\" value=\"RetailInstallerBuild\"><SuccessCriteria><field>Projects</field><comparison>equal</comparison><value>8</value></SuccessCriteria><SuccessCriteria><field>Status</field><comparison>equal</comparison><value>Success</value></SuccessCriteria></Condition></Conditions></Process><Process><ProcessName>ParseISLogStats</ProcessName><startTimeHeader>StartTime</startTimeHeader><Conditions><Condition name=\"BuildProject\" value=\"DInstallerBuild\"><SuccessCriteria><field>Status</field><comparison>equal</comparison><value>Success</value></SuccessCriteria></Condition><Condition name=\"BaseBuildArea\" value=\"D:\\R\\Builds\\K\\v2.1\\nightly\"><SuccessCriteria><field>Status</field><comparison>equal</comparison><value>Success</value></SuccessCriteria></Condition></Conditions></Process><Process><ProcessName>ParseISLogStats</ProcessName><startTimeHeader>StartTime</startTimeHeader><Conditions><Condition name=\"BuildProject\" value=\"KInstallerBuild\"><SuccessCriteria><field>Status</field><comparison>equal</comparison><value>Success</value></SuccessCriteria></Condition><Condition name=\"BaseBuildArea\" value=\"D:\\R_Builds\\K\\v2.1\\nightly\"><SuccessCriteria><field>Status</field><comparison>equal</comparison><value>Success</value></SuccessCriteria></Condition></Conditions></Process><Process><ProcessName>ParseISLogStats</ProcessName><startTimeHeader>StartTime</startTimeHeader><Conditions><Condition name=\"BuildProject\" value=\"KInstallerBuild\"><SuccessCriteria><field>Status</field><comparison>equal</comparison><value>Success</value></SuccessCriteria></Condition><Condition name=\"BaseBuildArea\" value=\"D:\\R_Builds\\K\\v2.1\\nightly\"><SuccessCriteria><field>Status</field><comparison>equal</comparison><value>Success</value></SuccessCriteria></Condition></Conditions></Process><Process><ProcessName>ParseISLogStats</ProcessName><startTimeHeader>StartTime</startTimeHeader><Conditions><Condition name=\"BuildProject\" value=\"Incremental_v2.1\"><SuccessCriteria><field>Status</field><comparison>equal</comparison><value>Success</value></SuccessCriteria></Condition><Condition name=\"BaseBuildArea\" value=\"D:\\RP_Builds\\KPEX\\v24.1\\nightly\"><SuccessCriteria><field>Status</field><comparison>equal</comparison><value>Success</value></SuccessCriteria></Condition></Conditions></Process><Process><ProcessName>UpdateBuildArea-Stats</ProcessName><startTimeHeader>StartTime</startTimeHeader><Conditions><Condition name=\"DestPath\" value=\"\\mach62\\Builds\\nightly\"><SuccessCriteria><field>Dir</field><comparison>equal</comparison><value>Retail</value></SuccessCriteria></Condition><Condition name=\"DestPath\" value=\"\\mach62\\Builds\\nightly\"><SuccessCriteria><field>eSecs</field><comparison>greaterThan</comparison><value>0</value></SuccessCriteria></Condition></Conditions></Process></build></BuildVerification>";
    XmlSerializer serializer = new XmlSerializer(typeof(BuildVerification));
    using (StringReader reader = new StringReader(xml))
    {
       test = (BuildVerification)serializer.Deserialize(reader).Dump();
    
    }

    XmlWriterSettings settings = new XmlWriterSettings();
    settings.OmitXmlDeclaration = true;
    MemoryStream ms = new MemoryStream();
    XmlWriter writer = XmlWriter.Create(ms, settings);
    XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
    ns.Add("", "");
    XmlSerializer s = new XmlSerializer(typeof(BuildVerification));
    s.Serialize(writer, test, ns);
    ms.Flush();
    ms.Seek(0, SeekOrigin.Begin);
    StreamReader sr = new StreamReader(ms);

    string x = sr.ReadToEnd().Dump();

}


[XmlRoot(ElementName = "SuccessCriteria")]
public class SuccessCriteria
{

    [XmlElement(ElementName = "field")]
    public string Field { get; set; }

    [XmlElement(ElementName = "comparison")]
    public string Comparison { get; set; }

    [XmlElement(ElementName = "value")]
    public string Value { get; set; }
}

[XmlRoot(ElementName = "Condition")]
public class Condition
{

    [XmlElement(ElementName = "SuccessCriteria")]
    public List<SuccessCriteria> SuccessCriteria { get; set; }

    [XmlAttribute(AttributeName = "name")]
    public string Name { get; set; }

    [XmlAttribute(AttributeName = "value")]
    public string Value { get; set; }

    [XmlText]
    public string Text { get; set; }
}

[XmlRoot(ElementName = "Conditions")]
public class Conditions
{

    [XmlElement(ElementName = "Condition")]
    public List<Condition> Condition { get; set; }
}

[XmlRoot(ElementName = "Process")]
public class Process
{

    [XmlElement(ElementName = "ProcessName")]
    public string ProcessName { get; set; }

    [XmlElement(ElementName = "startTimeHeader")]
    public string StartTimeHeader { get; set; }

    [XmlElement(ElementName = "Conditions")]
    public Conditions Conditions { get; set; }
}

[XmlRoot(ElementName = "build")]
public class Build
{

    [XmlElement(ElementName = "BuildMachine")]
    public string BuildMachine { get; set; }

    [XmlElement(ElementName = "Process")]
    public List<Process> Process { get; set; }
}

[XmlRoot(ElementName = "BuildVerification")]
public class BuildVerification
{

    [XmlElement(ElementName = "codeFreezeTime")]
    public string CodeFreezeTime { get; set; }

    [XmlElement(ElementName = "build")]
    public List<Build> Build { get; set; }
}


© www.soinside.com 2019 - 2024. All rights reserved.