0

XPATHクエリを実行したい次のgraphmlドキュメントを持っています

<?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);

正直なところ、私はこのソリューションもあまり好きではありません。私には、を使用する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 ドキュメントで見つけることができません (わかりません)どこを見るか)。ヒントはありますか?

4

1 に答える 1

1

graphml名前空間はhttp://graphml.graphdrawing.org/xmlnshttp://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 に答える