在不担心命名空间的情况下查询XML

时间:2011-09-08 17:15:40

标签: c# .net xml linq linq-to-xml

我在元素上有和没有前缀的XML,但没有为任何元素定义名称空间。当我尝试加载它时,它给我一个错误的XDocument.Load(至少,我认为它发生的地方),没有定义某些前缀。有没有办法告诉框架忽略任何名称空间前缀?我正在使用LINQ to XML,但如果可用的话可以使用其他东西。

我不一定能预先定义它们,因为我将使用各种文档,这些文档可能有也可能没有定义前缀,也没有明确的xmlns声明。

2 个答案:

答案 0 :(得分:2)

前缀是不应该代表命名空间的缩写?我相信在处理之前,你需要先清理那些没有与之关联的命名空间的前缀,因为它不是有效的XML。一个快速正则表达式,用于替换表格< /前缀的所有前缀:< /:和<前缀:with<应该这样做。

要执行此操作,请先替换以下正则表达式匹配项 </.*?: </ <.*?:<与{{1}}(不要更改排序)。

答案 1 :(得分:1)

您想要做的事情的方法可能是使用XmlDocument

XmlDocument d = new XmlDocument();
using (var textReader = new XmlTextReader(@"test.xml"))
{
    textReader.Namespaces = false;
    d.Load(textReader);
}

您将失去使用LINQ to XML语法查询数据的能力。

您实际上可以使用LINQ to XML并通过为文件中的每个前缀设置以下行来忽略命名空间

nameSpaceManager.AddNamespace("prefixName", "urn:ignore"); 其中nameSpaceManager的类型为XmlNamespaceManager。 但是根据你的问题,我觉得这不是一个合理的解决方案。