首页 > 解决方案 > 如何从 xml 文件中读取多个属性

问题描述

我有以下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 和结果的值并将这些值放在一个列表中。但是,在经历了多个示例之后,我无法做到这一点。

标签: c#linqxpath

解决方案


要获取DtoHeaders使用 Linq2Xml 的列表,您可以使用以下方法:

var headers = xDocument.Root.XPathSelectElements("./ns:Results", nameSpaceManager)
    .Elements()
    .Select(x => new DtoHeader
    {
        testName = x.Attribute("testName").Value,
        outcome = x.Attribute("outcome").Value
    })
    .ToList();

推荐阅读