繁体   English   中英

如何从xml文件读取多个属性

[英]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的值并将这些值放在列表中。但是,在经历多个示例之后,我无法做到这一点。

  1. items.Descendants().Attributes("testName")返回XAttribute IEnumerable
  2. 您需要选择每个XAttibuteValue成员并返回一个列表。

     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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM