我有以下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文档(我不知道在哪里看)。有人有任何提示吗?
答案 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);