2011-09-12 9 views

答えて

0

xmlNodePtrxmlDocPtrに、逆にキャストすることができます。文書の実際のトップレベルxmlDocPtrを指定

+0

libxml2では、型キャストされた子の 'xmlNodePtr'ポインタではなく、実際の最上位の' xmlDocPtr'ポインタで 'xmlXPathNewContext()'を呼び出す必要があります。 –

+0

ええと私はキャストをやっているし、問題なく動作しているようだ。メモリリークやデータ破損はありません。このアプリは現在1000回以上ダウンロードされており、xmlパーサーで実行されるデータに関する苦情はありません。このアプリのxpathコードはオープンソースです:https://github.com/kgn/KGLib/blob/master/Shared/KGXPath.m – keegan3d

+1

私は私の以前のコメントに立っています。 XPath自体は、指定された 'xmlDocPtr'から' children'リストにアクセスしています。これは 'xmlDocPtr'と' xmlNodePtr'の両方にメモリ内の同じオフセットで存在します。それが「働く」理由です。しかし、 'xmlDocPtr'は実際の' xmlDocPtr'を期待する様々なAPI関数に渡され、APIは 'xmlXPathNewContext()'が型キャストされた 'xmlNodePtr'ではなく' xmlDocPtr'を必要とすることを明確に述べています。あなたは本当にAPIが望んでいるものを尊重しなければなりません。 –

1

コールxmlXPathNewContextは()、次いでxmlDocPtr文書の子であり、所望のxmlNodePtrポインタにxmlXPathContext::nodeフィールドを設定します。

+0

私は自分のコードでキャストしていますが、うまく動作しているようです。 xmlXPathNewContextを使用してこれをお勧めしますか?それは必要ではないようです。 'xmlXPathContextPtr xpContext = xmlXPathNewContext((xmlDocPtr)node);' – keegan3d

+0

libxml2ソースコードを見ると、 'xmlDocPtr'パラメータが実際の' xmlDoc'オブジェクトを指すことを期待しています。これは、さまざまなAPI呼び出しの 'xmlDocPtr'パラメータとして内部的に渡されます。 'xmlXPathContext'は、作業中の実際の文書の子' xmlNodePtr'を追跡するために使用される別々の 'node'フィールドを持っています。 'xmlNodePtr'ポインターを型キャストされた' xmlDocPtr'ポインターとして渡すのは機能しているように見えるので、正しいことにはなりません。 –

関連する問題