XDocument未返回预期的元素
本文关键字:元素 返回 XDocument | 更新日期: 2023-09-27 18:21:16
我已经做了研究并尝试了许多试验,但这让我很困惑。我可能有点笨,但考虑到下面的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")
以及各种其他变体,但它们都产生了一个空的枚举。
我做错了什么?
只有怎么样
XNamespace ns = "http://microsoft.com/schemas/VisualStudio/TeamTest/2006";
yourXmlDocument.Descendants(ns + "UnitTestResult");
注意XNamespace
的显式定义,否则编译器将推断类型为string
而不是XNamespace
。
除非另有明确声明,否则声明默认名称空间的节点的后代继承相同的名称空间。因此,您需要为<Results>
和<UnitTestResult>
:使用相同的命名空间前缀
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");
所有其他答案都包括命名空间声明,这可能是正确的解决方案。您可能希望使用名称空间不可知的解决方案来忽略名称空间:
xdoc.Descendants()
.Where(node => node.Name.LocalName == "UnitTestResult")
无论定义了什么名称空间,都会产生结果
尽管使用了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);
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);
}
}