如何使用没有关联前缀的命名空间在C#中读取XML文档

J E*_*lis 3 .net c# xml xml-parsing

我正在尝试阅读OSIS格式的文档.我已将文档剪切成一个简单的片段:

<?xml version="1.0" encoding="utf-8"?>
<osis xmlns="http://www.bibletechnologies.net/2003/OSIS/namespace">
  <osisText osisRefWork="Bible" osisIDWork="kjv" xml:lang="en">
  </osisText>
</osis>
Run Code Online (Sandbox Code Playgroud)

我尝试使用MSDN文档中的示例代码阅读它:

XPathDocument document = new XPathDocument("osis.xml");
XPathNavigator navigator = document.CreateNavigator();
XPathNodeIterator nodes = navigator.Select("/osis/osisText");

while (nodes.MoveNext())
{
    Console.WriteLine(nodes.Current.Name);
}
Run Code Online (Sandbox Code Playgroud)

问题是选择不包含任何节点并且不会引发异常.由于代码丢弃了根标记,我无法读取文档.如果我从root osis标签中删除xmlns ="http://www.bibletechnologies.net/2003/OSIS/namespace",它就可以正常工作.攻击性URL返回404代码,但我发现此XML没有任何问题.有人可以解释为什么这段代码不会读取文件?除了在尝试加载每个文档之前手动编辑每个文档之外,我还有哪些选项?

har*_*rpo 9

您的XPath表达式缺少名称空间前缀.

您尝试选择的元素的名称空间URI为http://www.bibletechnologies.net/2003/OSIS/namespace,并且XPath 将不使用具有空名称空间URI的路径匹配这些节点.

我在.NET 2.0中测试了这个版本,它找到了预期的节点.

XPathDocument document = new XPathDocument("osis.xml");
XPathNavigator navigator = document.CreateNavigator();

XmlNamespaceManager xmlns = new XmlNamespaceManager(navigator.NameTable);
xmlns.AddNamespace("osis", "http://www.bibletechnologies.net/2003/OSIS/namespace");

XPathNodeIterator nodes = navigator.Select("/osis:osis/osis:osisText", xmlns);
Run Code Online (Sandbox Code Playgroud)