読者です 読者をやめる 読者になる 読者になる

XPathでリンク一覧を取得する

C#

Firefoxとかの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に属していないとおかしいはずなんですけど・・・。