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