0

我有以下 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 查询,但由于它定义了一个命名空间,我不确定节点的名称是什么。在这里搜索后,我发现了这个问题。接受的答案是剥离命名空间声明并重新加载文档,以便您可以使用本地名称(这违背了 XML 命名空间的要点),但是还有一条评论给了我以下语法:

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

老实说,我也不是很喜欢这个解决方案。在我看来,使用 anXMLNameSpaceManager应该可以解决这个问题,所以我尝试了以下方法:

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 文档中找不到它(我不知道在哪里看)。有人有任何提示吗?

4

1 回答 1

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);
于 2012-12-06T14:40:04.157 回答