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 ドキュメントで見つけることができません (わかりません)どこを見るか)。ヒントはありますか?