XPathでリンク一覧を取得する
//a[@href!='']
でリンク一覧を根こそぎとれます。しかしながら、XHTMLに対して、真面目にXPathを適用しようとしてハマりました。
C#のコードなんですが、
XmlDocument doc = new XmlDocument(); doc.XmlResolver = null; // DTDとかロードしないでね doc.Load("http://example.com/example.html"); // XHTML XmlNamespaceManager nsm = new XmlNamespaceManager(doc.NameTable); nsm.AddNamespace("x", "http://www.w3.org/1999/xhtml"); XmlNodeList anchors = doc.DocumentElement.SelectNodes("//x:a[@x:href!='']", nsm); foreach(XmlNode a in anchors) Console.WriteLine("{0}", a.Attributes["href"].Value);
このコードでは全く動きません。anchorsのCountは0になってしまっています・・・。
aもhrefもxhtml名前空間の要素ではないんでしょうか?さっぱり分かりません。
試行錯誤の上、
XmlNodeList anchors = doc.DocumentElement.SelectNodes("//x:a[@href!='']", nsm);
とすると動作することに気づきました。
hrefはどこの名前空間に属するのでしょう?
僕のXMLの文法上の解釈では、hrefは、xhtmlに属していないとおかしいはずなんですけど・・・。