【问题标题】:XDocument not returning expected elementsXDocument 没有返回预期的元素
【发布时间】:2014-09-09 13:20:07
【问题描述】:

我已经完成了我的研究并尝试了许多试验,但这让我很难过。我可能很厚,但鉴于以下 XML 文档,我怎样才能最容易地找到 UnitTestResult 元素?

<?xml version="1.0" encoding="UTF-8"?> 
<TestReport> 
   <TestRun id="5cbd568d-02e4-4003-96c7-3d82cc0c2060" name="neil@HP6550BTS2 2014-09-08 15:23:16" runUser="AS\neil" xmlns="http://microsoft.com/schemas/VisualStudio/TeamTest/2006">   
      <Results>
         <UnitTestResult executionId="c3194ea8-adec-4e50-a4b6-45e244c50963" testId="8e220518-d603-0136-5937-819380dd4738" testName="NewRowMatrixResourceBookingTest" computerName="HP6550BTS2" duration="00:00:00.0204886" startTime="2014-09-08T15:23:32.3595341+01:00" endTime="2014-09-08T15:23:33.8396821+01:00" testType="13cdc9d9-ddb5-4fa4-a97d-d965ccfc6d4b" outcome="Passed" testListId="2fc4d891-506d-45de-8c61-cf6aa44e8eb2">
            <Output>
            </Output>
         </UnitTestResult>
         <UnitTestResult executionId="c20b289e-4af5-4827-a35d-39360dec984a" testId="d48055d1-0a28-af07-4490-2bfca70dbbcf" testName="MatrixScreen_Checkout_NewScreenVersionLockedReason1" computerName="HP6550BTS2" duration="00:00:07.1635460" startTime="2014-09-08T15:23:33.8466828+01:00" endTime="2014-09-08T15:23:41.0143995+01:00" testType="13cdc9d9-ddb5-4fa4-a97d-d965ccfc6d4b" outcome="Passed" testListId="2fc4d891-506d-45de-8c61-cf6aa44e8eb2">
            <Output>
            </Output>
         </UnitTestResult>   
      </Results> 
   </TestRun> 
</TestReport>

我试过了

xdoc.Descendants("UnitTestResult")

xdoc.Elements("TestReport").Elements("TestRun").Elements("Results").Elements("UnitTestResult")

还有

var ns = "http://microsoft.com/schemas/VisualStudio/TeamTest/2006";
var x = from result in testReport.Elements("TestReport").Elements(XName.Get(ns, "TestRun")).Elements("Results").Elements("UnitTestResult")

以及其他各种变体,但它们都产生一个空枚举。

我做错了什么?

【问题讨论】:

    标签: c# linq-to-xml


    【解决方案1】:

    怎么样

    XNamespace ns = "http://microsoft.com/schemas/VisualStudio/TeamTest/2006";
    
    yourXmlDocument.Descendants(ns + "UnitTestResult");
    

    注意XNamespace 的显式定义,否则编译器会将类型推断为string 而不是XNamespace

    【讨论】:

      【解决方案2】:

      除非另有明确声明,否则声明默认命名空间的节点的后代继承相同的命名空间。所以你需要为 &lt;Results&gt;&lt;UnitTestResult&gt; 使用相同的命名空间前缀:

      XNamespace ns = "http://microsoft.com/schemas/VisualStudio/TeamTest/2006";
      var x = from result in xdoc.Elements("TestReport")
                                 .Elements(ns+"TestRun")
                                 .Elements(ns+"Results")
                                 .Elements(ns+"UnitTestResult");
      

      【讨论】:

        【解决方案3】:

        虽然使用XmlDocument 类而不是XDocument 类,但不久前我在尝试操作.testsettings 文件以确保启用代码覆盖率时遇到了类似的问题。我用来完成这项工作的代码如下,您可以尝试将其用作启动和运行的基础。我认为关键部分是使用ms 命名空间后缀以及声明命名空间。

        XmlDocument testSettings = new XmlDocument();
        testSettings.Load(fullSettingsPath);
        
        // Load the XML Namespace manager we need for reading the .testsettings file
        XmlNamespaceManager xmlnsm = new XmlNamespaceManager(testSettings.NameTable);
        xmlnsm.AddNamespace("ms", "http://microsoft.com/schemas/VisualStudio/TeamTest/2010");
        
        XmlNodeList coverageNodes = testSettings.SelectNodes(
            @"ms:TestSettings/ms:Execution/ms:AgentRule/ms:DataCollectors/ms:DataCollector[@uri='datacollector://microsoft/CodeCoverage/1.0']/ms:Configuration/CodeCoverage",
            xmlnsm);
        

        【讨论】:

          【解决方案4】:

          所有其他答案都包括命名空间声明,这可能是正确的解决方案。您可能希望使用与命名空间无关的解决方案来忽略命名空间:

          xdoc.Descendants()
              .Where(node => node.Name.LocalName == "UnitTestResult")
          

          无论定义的命名空间如何,都会产生结果

          【讨论】:

            【解决方案5】:
            private void AtribesAndInnerTexts(string pathToFile)
            {
            
              var doc = new System.Xml.XmlDocument();
              doc.LoadXml(File.ReadAllText(pathToFile));
                // desired node in this case UnitTestResult
              var UnitTestResults = doc.GetElementsByTagName("UnitTestResult");
                foreach (var unitTestResult in UnitTestResults)
                {
                    Console.WriteLine(((XmlElement) unitTestResult).GetAttribute("executionId"));
                    Console.WriteLine(((XmlElement) unitTestResult).InnerText);
                }
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-09-27
              • 2018-01-31
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多