2017-11-23 8 views
1

node.jsに小さなドキュメントパーサーを構築していますテストするために、私はa raw HTML fileを持っています、それは一般に、アプリケーションが実行されるときに実際のウェブサイトからダウンロードされます。node.jsでXPathを使用する

私の制約に一致するConsole.WriteLineの各セクションののコード例を最初に抽出したいのですが、それはC#で書かれていなければなりません。

//*[@id='System_Console_WriteLine_System_String_System_Object_System_Object_System_Object_']/parent::div/following-sibling::div/pre[position()>1]/code[contains(@class,'lang-csharp')] 

がI test the XPath online場合は、私が期待される結果、is in this Gist取得:これを行うには、私は、このサンプルのXPathを持っています。私のNode.jsアプリケーションで

は、私はまったく同じ情報を試して解析するxmldomxpathを使用しています:

var exampleLookup = `//*[@id='System_Console_WriteLine_System_String_System_Object_System_Object_System_Object_']/parent::div/following-sibling::div/pre[position()>1]/code[contains(@class,'lang-csharp')]`; 
var doc = new dom().parseFromString(rawHtmlString, 'text/html'); 
var sampleNodes = xpath.select(exampleLookup,doc); 

しかしこれは、何も返しません。

ここで何が起こっているのでしょうか?

答えて

1

これは、HTML(XHTML)のデフォルトの名前空間(xmlns="http://www.w3.org/1999/xhtml")が原因と考えられます。

xpath docsを見ると、あなたがuseNamespacesを使用して接頭辞に名前空間を結合して、あなたのXPathでプレフィックス(未テスト)を使用することができるはずですが...

var exampleLookup = `//*[@id='System_Console_WriteLine_System_String_System_Object_System_Object_System_Object_']/parent::x:div/following-sibling::x:div/x:pre[position()>1]/x:code[contains(@class,'lang-csharp')]`; 
var doc = new dom().parseFromString(rawHtmlString, 'text/html'); 
var select = xpath.useNamespaces({"x": "http://www.w3.org/1999/xhtml"}); 
var sampleNodes = xpath.select(exampleLookup,doc); 

代わりの接頭辞に名前空間を結合XPathでlocal-name()を使用することもできますが、お勧めしません。これはまたin the docsでカバーされています。

例...

//*[@id='System_Console_WriteLine_System_String_System_Object_System_Object_System_Object_']/parent::*[local-name()='div']/following-sibling::*[local-name()='div']/*[local-name()='pre'][position()>1]/*[local-name()='code'][contains(@class,'lang-csharp')]