使用C#XPath在运行时动态读取前缀xml名称空间

时间:2018-12-13 11:24:20

标签: c# .net xml xpath

我正在处理一个.net项目,该项目处理xml中存储的多种类型的数据。

示例xml字符串如下:

<?xml version="1.0" encoding="utf-8"?>
<wb:countries xmlns:wb="http://www.worldbank.org">
  <wb:country id="ABW" xmlns:wk="http://www.wikipedia.org">
    <wb:name>Aruba</wb:name>
    <wk:abc>15555</wk:abc>
  </wb:country>
  <wb:country id="ABW2" xmlns:wk1="http://www.wikipedia1.org">
    <wb:name>AAAAA</wb:name>
    <wk1:abc>1666</wk1:abc>
  </wb:country>
</wb:countries>

现在我必须通过XPath读取一些信息: 例如,我需要找到"//wb:name",我必须将合适的名称空间放入xmlNamespaceManager。像下面这样。

string findingPath = "//wb:name";
StringReader stringReader = new StringReader(xml); // xml is the above content.
XPathDocument res = new XPathDocument(stringReader);
XPathNavigator navigator = res.CreateNavigator();
XmlNamespaceManager xmlNamespaceManager = new XmlNamespaceManager(navigator.NameTable);
xmlNamespaceManager.AddNamespace("wb", "http://www.worldbank.ort");
XPathNodeIterator nodeIterator = navigator.Select(findingPath , xmlNamespaceManager)

现在,问题是我不完全知道我在编码时需要添加的所有名称空间。对于上面的示例,如果我想获取"wk1:abc"值,则还必须添加合适的名称空间。我上面写的xml文本只是一个例子,在我的真实系统中,名称空间可能更多。

我的问题是我如何在运行时读取xml并添加合适的名称空间(例如:在包含xmlns:wk1="xxx"的行中进行读取会将wk1-“ xxx”对放入名称空间管理器)。如果我一开始就读了整个前缀xml名称空间,则名称空间范围可能不完全是要用select执行findingPath命令。

0 个答案:

没有答案