如何在 C# 中忽略 XML 文档中的命名空间?

And*_*lor 1 c# xml

我正在尝试在 C# 中打开一个 XML 文件,按属性名称查找节点,这工作正常,然后在同一节点中显示 XML 属性的名称。

我的代码很简单(因为我从其他来源摘取了它!)并且适用于我的测试 XML 文档。但是,当我用实际文件尝试它时,它不起作用。我一直在抓狂(并不是说我还剩下多少),并发现这是因为我正在使用的实际文件中的 xmlns 属性。命名空间的路径不存在。

我的代码如下:

XmlDocument doc = new XmlDocument();
doc.Load(@"c:\deroschedule\test.sym");
var orient = doc.SelectSingleNode("//Attr[@name='Orientation]/@value");
Run Code Online (Sandbox Code Playgroud)

当文件中不包含 xmlns 时,上述代码可以完美运行。但是,当包含 xmlns 时,orient 变量为 null。xmlns 路径不存在,当我尝试在浏览器中导航到它时,出现 404 错误。

老实说,我不确定 xml 命名空间是什么,但我有数千个这样的文件,并且无法手动编辑它们。有没有一种简单的方法可以让 C# 忽略名称空间并假装它不存在?我尝试过 Xpath,但这让我大吃一惊!

And*_*lor 5

好吧,我自己想出来了。我想我会在这里发布答案,尽管显然还有数千个其他答案。

我出错的地方是误解了命名空间的实际作用。无论如何,我必须使用 xmlnamespacenmanager 来声明与 xml 文件中相同的命名空间。然后我必须在查询中使用名称空间。

XmlDocument doc = new XmlDocument();
doc.Load(@"C:\deroschedule\test6.sym");
XmlNamespaceManager ns = new XmlNamespaceManager(doc.NameTable);
ns.AddNamespace("ma", "http://www.yournamespaceinfohere.com/");
var orient = doc.SelectSingleNode("//ma:attr[@name='Orientation']/@value", ns);
Run Code Online (Sandbox Code Playgroud)

现在我的下一个挑战是尝试从 xml 文件中读取 bmp,应该很容易,对吧?!