我正在尝试使用 C# 和 linq 从 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>
我更新了上次发布的代码。您不需要在 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);
}
}
}
}