gpt4 book ai didi

c# - 有 xmlns= 时如何查找 XML 节点

转载 作者:行者123 更新时间:2023-11-30 21:44:38 25 4
gpt4 key购买 nike

Visual Studio 在运行测试时会创建“.trx”文件,而我正在尝试处理这些文件中的 XML。但是,当我尝试使用 Xpath 表达式访问部分 XML 时,我得到了意想不到的结果。

下面的代码包含一个“.trx”文件的缩减版本。这些文件包含一个 xmlns="..." 属性,该属性似乎可以防止 Xpath 访问。当 xmlns... 被删除时,访问工作并找到预期的节点。

如何更改命名空间管理器 (manager) 或代码中的 Xpath(或其他),以便我可以在未修改的 XML 中获取与各种 Xpath 匹配的节点列表。

我尝试添加 manager.AddNamespace("ns", trxContent.NamespaceURI); 并在 Xpath 中包含 ns:,但没有成功。

using System;
using System.Xml;

namespace XpathXmlns
{
class XpathXmlns
{
static string WithXmlns = @"<?xml version=""1.0"" encoding=""UTF-8""?>
<TestRun id=""111"" name=""someName"" runUser=""someUser"" xmlns=""http://microsoft.com/schemas/VisualStudio/TeamTest/2010""> tr1
<TestSettings name=""Local1"" id=""222"" idx=""333""> ts2
<Description>Description 1 context.</Description> ts3
</TestSettings> tr4
<TestSettings name=""Local2"" id=""333"" idx=""444""> ts5
<Description>Description 2 context.</Description> ts6
</TestSettings> tr7
</TestRun>
";

static void Main(string[] args)
{
string WithoutXmlns = WithXmlns.Replace(@" xmlns=""http://microsoft.com/schemas/VisualStudio/TeamTest/2010""", "");

ProcessXml("WithXmnns", WithXmlns);
ProcessXml("WithoutXmlns", WithoutXmlns);
}

static int counter = 0;
static XmlNamespaceManager manager;

static void ProcessXml(string label, string xml)
{
Console.WriteLine(label);
Console.WriteLine(xml);
XmlDocument trxContent = new XmlDocument();
trxContent.LoadXml(xml);

XmlNameTable xmlnt = trxContent.NameTable;
manager = new XmlNamespaceManager(xmlnt);
//manager.AddNamespace("ns", trxContent.NamespaceURI);

XmlNode root = trxContent.DocumentElement;

Extract(trxContent, "//TestRun");
Extract(trxContent, "//TestRun/TestSettings");
Extract(trxContent, "//TestRun/TestSettings/Description");
Extract(trxContent, "//Description");
Extract(trxContent, "//TestSettings/@id");
//Extract(trxContent, "//@id"); // This works OK, it finds the nodes in both cases.
//Extract(trxContent, "//@idx"); // This works OK, it finds the nodes in both cases.
Extract(trxContent, "//ns:TestRun");
Extract(trxContent, "//ns:TestRun/TestSettings");
Extract(trxContent, "//ns:TestRun/TestSettings/Description");
Extract(trxContent, "//ns:Description");
Extract(trxContent, "//ns:TestSettings/@id");
}

static void Extract(XmlDocument doc, string xpath)
{
counter = 0;
ExtractNodes("doc-node", doc, xpath);
ExtractDocNodes("doc", doc, xpath);
Console.WriteLine();
}

private static void ExtractNodes(string source, XmlNode root, string xpath)
{
counter++;
XmlNodeList nodes = root.SelectNodes(xpath, manager);
ListFoundNodes(source, xpath, nodes);
}
private static void ExtractDocNodes(string source, XmlDocument root, string xpath)
{
counter++;
XmlNodeList nodes = root.SelectNodes(xpath, manager);
ListFoundNodes(source, xpath, nodes);
}

private static void ListFoundNodes(string source, string xpath, XmlNodeList nodes)
{
Console.WriteLine(" {0,2}: Get {1} from {2} {3}", counter, nodes.Count, source, xpath);
foreach (XmlNode node in nodes)
{
Console.WriteLine(" Nodes name='{0}'", node.Name ?? "__None__");
}
}
}
}

最佳答案

Xmlns 属性定义元素的 xml 命名空间。因此,您的 TestRun 元素(以及它下面的所有元素)属于命名空间 http://microsoft.com/schemas/VisualStudio/TeamTest/2010。所以首先你必须将该 namespace 添加到管理器:

XmlNameTable xmlnt = trxContent.NameTable;
manager = new XmlNamespaceManager(xmlnt);
manager.AddNamespace("ns", @"http://microsoft.com/schemas/VisualStudio/TeamTest/2010");

如果不想硬编码,可以使用根元素的命名空间:

XmlNode root = trxContent.DocumentElement;
XmlNameTable xmlnt = trxContent.NameTable;
manager = new XmlNamespaceManager(xmlnt);
manager.AddNamespace("ns", root.NamespaceURI);

然后您必须在查询中使用您定义的命名空间前缀 (ns):

Extract(trxContent, "//ns:TestRun");
// note that all subelements (like TestSettings) are also prefixed
Extract(trxContent, "//ns:TestRun/ns:TestSettings");
Extract(trxContent, "//ns:TestRun/ns:TestSettings/ns:Description");
Extract(trxContent, "//ns:Description");
Extract(trxContent, "//ns:TestSettings/@id");

关于c# - 有 xmlns= 时如何查找 XML 节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40718818/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com