我正在尝试使用 linq 访问 xml 文件深处的 xml 数据。我一直在看这些例子: linq linq
我没有看到一个不涉及名字的好例子。
到目前为止我有这个代码:
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
}
这就是我的 xml 的样子:
<?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>
</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>
请尝试以下解决方案。
c#
void Main()
{
const string FILENAME = @"e:\Temp\Michele.xml";
XDocument xdoc = XDocument.Load(FILENAME);
foreach (var elem in xdoc.Descendants("SuccessCriteria"))
{
Console.WriteLine("field='{0}', comparison='{1}', value='{2}'",
elem.Element("field")?.Value,
elem.Element("comparison")?.Value,
elem.Element("value")?.Value);
}
}
输出
field='Status', comparison='equal', value='Success'
field='Status', comparison='equal', value='Success'
...