2011-02-16 9 views
1

私は、libxml2 SAXパーサーのXMLエンティティの値を、アンサーをthis questionにどのように示唆しているかと同様に取得しています。具体的には、私のコードは、(attributes[i].value*xmlCharである)ので、次のようになります。libxml2のエンティティがSAX解析された属性値をエンコードするのはなぜですか?

int valueLength = (int) (attributes[i].end - attributes[i].value); 
    value = [[[NSString alloc] initWithBytes:attributes[i].value 
             length:valueLength 
            encoding:NSUTF8StringEncoding 
    ] autorelease]; 

しかし、属性値(この場合はURL)は、元のXMLで実体&を持っているいくつかの理由で、私が得る価値のために&#38です。

libxml2で属性エンティティをデコードするにはどうすればいいですか(テキストノードエンティティではうまくいくようです)、&が得られますか?

答えて

3

libxml2はデフォルトでエンティティを置き換えません。xmlReaderを作成するときには、これをオンにする必要があります。

このコードは

http://xmlsoft.org/examples/reader2.c

XML_PARSE_NOENTためのドキュメントがここに例を持っています。

http://xmlsoft.org/html/libxml-parser.html

私はlibxml2のからエンティティ・ビットを使用するので、それはしばらくしているが、私は代わりにデフォルトのエンティティリゾルバを取得するために何かをする必要が思い出します。それについての文書。ブログ記事ですが、これはそれをラップしていない場合

http://xmlsoft.org/xmlio.html

戻って私にpingを実行し、私は写真Briskoのソースで見ていきますしてください、私は

...そこにそれを処理しなければなりませんでした長いったらしい私はここから

http://bill.dudney.net/roller/objc/entry/libxml2_push_parsing

サンプルは、エンティティのものが同様にオンになっている場合がありますが、その限り、私は忘れてしまったされて、私はそれを介して戻って今の時間を持っていない。考えます

幸運を祈る!

+0

はい、あなたのlibxml2ブログ投稿が私のコードの出発点でした。 AFAICTにはエンティティに関連するものはありません。 'xmlCreatePushParserCtxt()'には 'xmlReaderForFile()'と同様に 'options'引数はありません。しかし、おそらく 'simpleSAXHandlerStruct'構造体の右のスロットに関数ポインタが必要ですか?私は今それを見ている... – theory

+2

ああ、それを見つけた。 'xmlContext = xmlCreatePushParserCtxt(&simpleSAXHandlerStruct、self、NULL、0、NULL);'という文脈を作成した行の後に、別の行に 'xmlCtxtUseOptions(xmlContext、XML_PARSE_NODICT | XML_PARSE_NOENT);オプションを設定します。それはトリックです。ありがとう! – theory

+0

'XML_PARSE_NOENT'をちょうど使用しています。 'XML_PARSE_NODICT'が何のためのものなのかを知りません。これは一行の文書ではあまり意味がありません。 'XML_PARSE_NOENT'は私が必要なものです。なぜエンティティがテキストノードでデコードされるのか不思議ですが、属性値をデコードするにはこの設定が必要です。つまり、どうして違うはずですか?とにかく、もう一度ありがとう。 – theory

関連する問題