我正在处理一个.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
命令。