【问题标题】:How can I ignore the namespace in an XML document in c#?如何在 C# 中忽略 XML 文档中的命名空间?
【发布时间】:2017-05-11 20:22:35
【问题描述】:

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

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

我的代码如下:

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

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

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

【问题讨论】:

  • 您不应“忽略”它,而应在查询中指定它。
  • 好的,谢谢,关于如何将其包含在查询中的任何提示?
  • 有示例 xml 吗?
  • 嗨,抱歉,不知道如何附加。您可以在这里找到 XML 文件:dero.co.uk/dev/test6.sym 这是一个 sym 文件,但实际上是 XML
  • 忽略命名空间有点像忽略名称的前三个字符。这不是你想做的事情。对于问题的答案,只需搜索“XPath 默认命名空间”并从数千个答案中进行选择。

标签: c# xml


【解决方案1】:

好吧,我自己想通了。以为我会在这里发布答案,即使显然还有成千上万的其他答案。

我出错的地方是误解了命名空间的实际作用。无论如何,我必须使用 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);

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

【讨论】:

  • 如果您发现自己经常使用 XML,请创建一个简单的控制台应用程序来试验 XML、命名空间、xpath 等。抱歉,如果您已经这样做了,或者这很明显。
  • 不,这听起来是个好主意,肯定会这样做!谢谢
猜你喜欢
  • 2010-09-21
  • 2011-12-05
  • 2015-02-18
  • 1970-01-01
  • 1970-01-01
  • 2021-11-28
  • 2016-12-18
  • 2016-06-24
  • 1970-01-01
相关资源
最近更新 更多