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

时间:2017-05-10 11:10:57

标签: 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");

当xmlns未包含在文件中时,上述代码可以正常工作。但是,当包含xmlns时,orient变量为null。 xmlns路径不存在,当我尝试在浏览器中导航到它时,我收到404错误。

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

1 个答案:

答案 0 :(得分:3)

好的,我为自己想出来了。我想我会在这里发布答案,尽管显然有成千上万的其他答案。

我出错的地方误解了命名空间实际上做了什么。无论如何,我必须使用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,应该很简单,对吧?!