• 締切済み

xml_parseで実体参照が無視される

phpでxmlをparseするコードを作成していますが、 動きが良く分からないものがあったので質問です。 以下のような、XMLがあります。 ・XML <a>1&lt;2<a> これを以下のようなPHPでparseします。 ・php function func_char($parser, $data){ print "char: $data\n"; } $parser = xml_parser_create(); xml_set_character_data_handler($parser , "func_char"); xml_parse($parser, "<a>1&lt;2<a>"); 出力が以下のようになります。 ・出力結果  char: 1  char: 2 間に"char: <"が出力されるかと思ったのですが、出力されません。 何か心当たりのある方はいらっしゃいますでしょうか? 実行環境 ---------------------- OS:CentOS 5.2 Apache 2.2.9 php 5.2.6 libxml2 2.7.2 ----------------------

  • PHP
  • 回答数2
  • ありがとう数0

みんなの回答

  • UmJammer
  • ベストアンサー率58% (115/196)
回答No.2

ANo.1です。 つまり実際上手くいっていないものとは別のコードということですね。 では、この(質問に書かれている)コードを実行してみた結果はどうですか?

gunz1813
質問者

補足

返事が遅くなってしまい誠に申し訳ありません。 私がこの質問に書いたコードを実行してみると、 "char: <"は出力されません。 他の実行環境(OSやPHPのバージョンが違います)もあるのですが、 そこで実行すると期待通りに"char: <"が出力されます。 ネット等で散々調べたのですが結局原因は分かりませんでした。 とりあえず、CDATAを使って"<"が消える現象を回避しようかと思っています。 <a><![CDATA[1&lt;2]]><a>

  • UmJammer
  • ベストアンサー率58% (115/196)
回答No.1

以下をそのまま貼り付けて実行してみましたが"char: <"も出力されました。 実際に使われているコードですか? function func_char($parser, $data){ print "char: $data\n"; } $parser = xml_parser_create(); xml_set_character_data_handler($parser , "func_char"); xml_parse($parser, "<a>1&lt;2<a>");

gunz1813
質問者

補足

ご回答ありがとうございます。 コードは簡略化したものです。 実際にはXMLが違ったりparserにオプションを指定したりしています。 PHPやlibxml2のバージョンを下げたりしてみましたが、 実行結果は同じでした。

関連するQ&A

  • xml_parse_into_structを使うと、xmlの中のCDATAが消える

    XMLデータを取得するプログラムをPHP5で製作しています。 以下、コーディング ----------------------------------------------------------- $contents = file_get_contents($restURL); $parser = xml_parser_create('UTF-8'); xml_parse_into_struct($parser,$contents,$values); xml_parser_free($parser); ----------------------------------------------------------- file_get_contentsでXMLデータの取得した時点では、例えば  <img><![CDATA[<hogehoge>]]></img> というふうにCDATAが格納されていることは確認できています。 しかし、xml_parse_into_structで配列構造体にXMLデータを格納すると、   [0] => Array ( [tag] => IMG [type] => complete [level] => 4 [value] => ) という感じに、"value"の中の値が空になってしまいます。 xml_parse_into_structで"CDATA"が消えずに配列構造体される方法、 または、xml_parse_into_struct以外で"CDATA"が消えずに配列構造体に 設定される手法はありますでしょうか。

    • ベストアンサー
    • PHP
  • xml_parse_into_structでなぜか0が返ります

    http://iac-npo.de-blog.jp/yamazaki/atom.xml 上記のアドレスは、あるプロ野球選手のブログのRSSです(atom形式)。 これをxml_parse_into_structを使い、配列構造体に格納しようと考えています。 しかし、なぜか返り値は0。配列は当然カラです。 XMLについては文字コードはUTF8ですし、構造もきちんとしているように見えます。 何が原因なのでしょうか? ソースは以下の通りです。 $content=file_get_contents('http://iac-npo.de-blog.jp/yamazaki/atom.xml'); $xml_parser=xml_parser_create(); xml_parse_into_struct($xml_parser,$content,$vals); xml_parser_free($xml_parser);

    • ベストアンサー
    • PHP
  • DOMでパースしているXML全体の出力方法

    お世話になります。 JavaでDOMを使ってXML操作をしたいと考えております。 おおよそ、以下のソースでparseできるところまで確認できました。 DOMParser parser = new DOMParser(); parser.parse("XMLファイルパス"); Document doc = parser.getDocument(); 開発中なので、DOM操作した結果のXMLを随時コンソールやログに 出力させたいのですが、たとえばdoc.toString()してもnullとなり、 正常に出力されません。 以下のようにElementを取得すると正常にアクセスできていることは 確認しています。 Element rootEl = doc.getDocumentElement(); System.out.println(rootEl.getNodeName()); なお、DOMライブラリにはxercesを用いております。 Dom4jのAPIも見てみましたが、それらしいメソッドを見つけることが できていません。 簡単にXMLを出力できることが理想です。 一般的な方法、よくやる手法など、みなさんよりご教示頂きたいです。

    • ベストアンサー
    • Java
  • XML::LibXMLのfindnodes()で、ワイルドカードを使いたい

    XML::LibXMLでXPathを使いたいのですが、 ワイルドカードの指定がうまくいきません。 要素名に*を当てはめたいのですが、、、、 例えば以下の通りです。 下記XMLのid="1-1"とid="1-2"を抜きだしたいのです。 できればXPathにて指定したいのですが、、、 教えてください。 my $dom = $parser->parse_file($xml_file_str) or die; $x = "//Test/TestText[@id="1-*"]/text()"; $c = $dom->findnodes($x); 解析対象XML <XML> <Test> <TestText id="1-1">テスト1</TestText> <TestText id="1-2">テスト2</TestText> <TestText id="2-1">テスト3</TestText> </Test> </XML>

    • ベストアンサー
    • Perl
  • XMLデータをhttpリクエストで送信したい

    まずlibxml2ライブラリを使用してxmlDocPtr型のXMLデータを作成しました。 これをHTTPリクエストのボディ部に突っ込んで(POST?)リクエスト送信したいのですが、 どうすれば送信できるのでしょうか。 xmlDocPtr型のXMLデータをchar型に格納すればいけるのかなと思っているんですが。 libxml2ライブラリでxmlDocPtr型データをバイナリに変換するAPIがよく分かりません。 お知恵を拝借させて下さい。

  • PerlでXMLのフィルタリング

    いつもお世話になっております。Perl初心者です。 以下のサイトを参考に、XML::Parser::PerlSAX を使用して、XMLファイルをフィルタリングするプログラムを作成しようと考えています。 http://mkweb.bcgsc.ca/intranet/perlbook/pxml/ch05_01.htm ここで、ある要素のある属性の、異なる属性値ごとに、文字データイベントを処理する方法を変えたいのですが、どのようにすればよいでしょうか。 各種SAXイベントハンドラも、XML::Handler::Subs も考えましたが、何を使えばよいか検討がつきません。よろしくお願いします。

  • SAXでXMLファイルを読むときにチェック(?)する

    お世話になります。 <?xml version="1.0"?> <!DOCTYPE A [ <!ELEMENT A (B)> ]> <A> </A> 上記のXMLをSAXにてparseをかけると多分「定義とちがうじゃん!」というような趣旨のエラーがでるとおもっていたのですが、普通に処理されてしまいました。 DTDのチェックってどうやってやるのでしょうか? SAXParserFactory factory = SAXParserFactory.newInstance(); factory.setValidating(true); SAXParser parser = factory.newSAXParser(); parser.parse(xmlFile, new DefaultHandler()を拡張したクラス); このようなかんじでやっているのですが、 これがまちがえていますか? SAXのバージョンとかも関係するのかもしれないのですが、 これ使ってともらったやつなのでどのように調べていいのかわかりません。 以上よろしくお願い致します。

    • ベストアンサー
    • Java
  • PHPからFlashにXMLをそのまま渡す方法

    こんにちは PHPでXMLファイルを読み込み、それをそのままFlashに渡しFlash側でXMLをパーサしようと、このように書きました ------------------------------------------------------- (PHP) <?php $url = 'test.xml'; $h = fopen($url, "r"); $result_xml= ''; while(!feof($h)) { $result_xml.= fread($h, 4096); } fclose($h); echo "&data=$result_xml&"; ?> ------------------------------------------------------- (Flash) var xml:XML = new XML(); xml.load("work.php"); xml.onLoad = function(success:Boolean):Void { if (success) { trace(this.data); } }; ------------------------------------------------------- するとtraceの結果はundefinedでした。 PHPの出力結果が文字列型だということが原因のような気がするのですが、PHP側から文字列で出力するのではなく、XMLで出力するにはどうしたらよいでしょうか? リファレンスを探してみたのですが、なかなかそういった関数が見つかりませんでした。 よろしくお願いします。

  • SAXでparseを行う際の、DTDとの妥当性チェックついて

    Java&XMLの初心者です。 用語の使い方など間違っているかもしれませんが、 よろしくお願いします。 XMLパーサーにxercesを利用しています。 以下のようなXMLをがあったときに、 <?xml version="1.0"?> <!DOCTYPE a SYSTEM "a.dtd"> <a> <b>1</b> <b>1</b> </a> 以下のコードを実行すると、  SAXParserFactory f = SAXParserFactory.newInstance();  f.setValidating(true);  SAXParser p = f.newSAXParser();  p.parse((InputSource)xml, handler); カレントディレクトリにあるa.dtdとの妥当性をチェックしますが、 これをファイルは無視し、指定した文字列とチェックをさせるなどと いうことは可能でしょうか?

    • ベストアンサー
    • XML
  • Java ファイルオブジェクトでなく文字列オブジェクト?

    JavaでXMLをパースするプログラムを初めて試しています。 parseメソッドの第一引数がファイルオブジェクトなのですが、これをメモリ(文字列)オブジェクトを与えて同じ動作させるものはあるのでしょうか? // SAXパーサーファクトリを生成 SAXParserFactory spfactory = SAXParserFactory.newInstance(); // SAXパーサーを生成 SAXParser parser = spfactory.newSAXParser(); // XMLファイルを指定されたデフォルトハンドラーで処理します parser.parse(new File("helloworld.xml"), new InsXMLParser()); ※このように String str = "<xml? ......"; parser.XXXXXX(str, new InsXMLParser

    • ベストアンサー
    • XML

専門家に質問してみよう