在使用XPATH查询之前,如何将正确的XML命名空间提供给管理器

时间:2012-12-06 14:25:24

标签: c# xml xml-namespaces

我有以下graphml文档,我想在其上执行XPATH查询

<?xml version="1.0" encoding="UTF-8"?>
<graphml xmlns="http://graphml.graphdrawing.org/xmlns"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns
     http://graphml.graphdrawing.org/xmlns/1.0/graphml.xsd">
  <graph id="G" edgedefault="undirected">
    <node id="n0"/>
    <node id="n1"/>
    <edge id="e1" source="n0" target="n1"/>
  </graph>
</graphml>

我想对此文档执行XPATH查询,但由于它定义了命名空间,我不确定节点的名称是什么。在这里搜索后,我发现了this个问题。接受的答案是剥离命名空间声明并重新加载文档,以便您可以使用本地名称(这会破坏XML命名空间的点),但是也有一个注释给了我以下语法:

var nodeList = input.SelectNodes("//*[local-name()='node']", nsmgr);

说实话,我也不喜欢这个解决方案。对我来说似乎使用XMLNameSpaceManager应该可以解决这个问题所以我尝试了以下内容:

string xmlns = input.DocumentElement.Attributes["xmlns"].Value;
XmlNamespaceManager nsmgr = new XmlNamespaceManager(input.NameTable);
nsmgr.AddNamespace("graphml", xmlns); //Problematic?

var nodeList = input.SelectNodes("//node", nsmgr);

然而,使用此//node并没有给我任何结果,这可能是由于我标记有问题的行,我不确定如何调用GrapML的命名空间,我无法在XSD文档(我不知道在哪里看)。有人有任何提示吗?

1 个答案:

答案 0 :(得分:1)

graphml命名空间似乎是http://graphml.graphdrawing.org/xmlns(来自http://graphml.graphdrawing.org/primer/graphml-primer.html)。

因此,使用nsmgr.AddNamespace("graphml", "http://graphml.graphdrawing.org/xmlns")将其添加到命名空间管理器,然后使用以下内容选择节点:

var nodeList = input.SelectNodes("//graphml:node", nsmgr);