从xml获取属性并打印错误

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

我正在尝试使用 C# 和 linq 从 xml 中检索属性值。打印时属性数据为空。任何帮助将不胜感激。除了检索属性值之外,它还完美地获取了 xml 的其余部分。修复后获得 xml 后,我将根据每日构建的日志值检查它以确定是否成功。

我查看了这些链接:

属性检索值 xml 值任意深度

这是我的结果,后面是检索所有 xml 的代码。请注意,2-10 个构建标签和 1-3 个 SuccessCriteria 标签内有不同的条件和流程:

结果(注释名称和位置未正确检索,因此打印空白:

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'

代码

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>
c# xml linq
1个回答
0
投票

我更新了上次发布的代码。您不需要在 foreach 中转换为字符串,因为所有项目都已经是字符串。

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

            }
        }
    }

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