[英]How to read multiple attributes from an xml file
我有以下xml:
<?xml version="1.0" encoding="UTF-8"?>
<TestRun id="2fc10ef6-b97f-49e5-a58d-863dfb599cb3" xmlns="http://microsoft.com/schemas/VisualStudio/TeamTest/2010">
<Times creation="2019-08-26T11:27:34.3642040+00:00" queuing="2019-08-26T11:27:34.3642190+00:00" start="2019-08-26T11:27:29.1640690+00:00" finish="2019-08-26T11:29:28.0320260+00:00" />
<TestSettings name="default" id="3c3c8ad0-9076-4c83-a283-03f5490f906b">
<Deployment runDeploymentRoot="_9e3d0007c2b9 2019-08-26 11:27:34" />
</TestSettings>
<Results>
<UnitTestResult testName="FirstName" outcome="Passed" testListId="1">
<Output>
</Output>
</UnitTestResult>
<UnitTestResult testName="SecondName" outcome="Passed" testListId="2">
<Output>
</Output>
</UnitTestResult>
<UnitTestResult testName="Thirdname" outcome="Passed" testListId="3">
<Output>
</Output>
</UnitTestResult>
</Results>
</TestRun>
我有以下课程:
{
public string testName { get; set; }
public string outcome { get; set; }
}
public DtoHeader ReadXmlFile()
{
var binDirectory = Path.GetDirectoryName(GetType().GetTypeInfo().Assembly.Location);
var file = Path.Combine(binDirectory, "myfile.xml");
var xDocument = XDocument.Load(file);
XmlNamespaceManager nameSpaceManager = new XmlNamespaceManager(new NameTable());
nameSpaceManager.AddNamespace("ns", "http://microsoft.com/schemas/VisualStudio/TeamTest/2010");
var items = xDocument.Root.XPathSelectElements("./ns:Results", nameSpaceManager).ToArray();
if (!items.Any())
{
}
return new DtoHeader
{
testName = items.Descendants().Attributes("testName").First().Value,
};
}
我想提取属性testName和result的值并将这些值放在列表中。但是,在经历多个示例之后,我无法做到这一点。
items.Descendants().Attributes("testName")
返回XAttribute
IEnumerable
。 您需要选择每个XAttibute
的Value
成员并返回一个列表。
var list = items.Descendants().Attributes("testName").Select(t => t.Value).ToList();
编辑:
作为DtoHeader
列表返回:
var list = items.Descendants().Attributes("testName").Select(t =>
new DtoHeader
{
testName = t.Value
}
).ToList();
要使用Linq2Xml获取DtoHeaders
列表,可以使用以下方法:
var headers = xDocument.Root.XPathSelectElements("./ns:Results", nameSpaceManager)
.Elements()
.Select(x => new DtoHeader
{
testName = x.Attribute("testName").Value,
outcome = x.Attribute("outcome").Value
})
.ToList();
我建议使用xmltocsharp将xml转换为类,并使用XmlSerializer
来完成其余的工作。 这是获得所需结果的简化代码。
string requestBody = ReadFile("XMLFile1.xml");
XmlSerializer serializer = new XmlSerializer(typeof(TestRun));
using (TextReader reader = new StringReader(requestBody))
{
//convert the xml to object
TestRun testRun = (TestRun)serializer.Deserialize(reader);
foreach (var result in testRun.Results.UnitTestResult)
{
Console.WriteLine($"{result.TestName} : {result.Outcome}");
}
}
var doc = XDocument.Load(file);
var list = new System.Collections.Generic.List<DtoHeader>();
foreach (var n in doc.Descendants().First(node => node.Name.LocalName == "Results").Elements().Where(e => e.Name.LocalName == "UnitTestResult"))
{
list.Add(new DtoHeader
{
outcome = n.Attribute("outcome").Value,
testName = n.Attribute("testName").Value,
});
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.