PerlでのXML処理でのDTD宣言について

このQ&Aのポイント
  • PerlのXML処理において、XML::LibXMLモジュールを使用しているが、DTD宣言部分を取得して書き出すことができない。
  • DTD宣言部分を取得する方法についてお尋ねしたい。
  • XML::LibXMLを使用している場合に、DTD宣言部分を書き出す方法を教えてください。
回答を見る
  • ベストアンサー

Perl での XML 処理での DTD 宣言につ

Perl の XML::LibXML モジュールを使用して XML を処理しています。 例えば、 <?xml version="1.0" encoding="UTF-16" standalone="no"?> <!DOCTYPE aaa PUBLIC "-//bbb//CCCC//EN" "ddd.dtd" []> <doc> ....... </doc> のようなXMLに対してPerlで処理をして、 最後に documentElement を toString して書き出しています。 しかし、この場合、DTD宣言部分を書き出すことができません。 XML::LibXMLでこの部分を取得して書き出すことはできますでしょうか。 どうぞ、よろしくお願いします。

  • Perl
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • sawa25
  • ベストアンサー率100% (2/2)
回答No.1

PODを見ながらやってみました。 こんな感じではないでしょうか。 #!/usr/bin/env perl use v5.16; use warnings; use utf8; use open IO => qw/:utf8 :std/; use autodie; use XML::LibXML; my $string = << 'EOF'; <?xml version="1.0" encoding="UTF-8" standalone="no"?> <!DOCTYPE aaa PUBLIC "-//bbb//CCCC//EN" "ddd.dtd" []> <doc> ....... </doc> EOF my $dom = XML::LibXML->load_xml(string => $string); my $dtd = $dom->internalSubset; say ref $dom; say ref $dtd; say $dtd->toString; 「XML::LibXML::Element」には、DTDを取り出すメソッドがないくさいので、もともとの「XML::LibXML::Document」オブジェクトから「XML::LibXML::Dtd」オブジェクトを引っこ抜いてくるのが楽な気がします。 結果は下記のようになりました。 XML::LibXML::Document XML::LibXML::Dtd <!DOCTYPE aaa PUBLIC "-//bbb//CCCC//EN" "ddd.dtd"> 僕もあまり詳しいわけではありませんので、ご参考になるかどうかわかりませんが……。

dokuso007
質問者

お礼

このやり方でうまくいきました。 困っていたのでとても助かりました、ありがとうございます!

関連するQ&A

  • XHTML1.1でのXML宣言とDTD宣言の書き方

    XML宣言によるレイアウトの崩れ等の質問はありましたが今回の質問と同じ内容は私には見当たらなかったため質問させて頂きます。 XHTMLでのXML宣言を <?xml version="1.0" encoding="utf-8"?> と記述しています。 上記の記述と <?xml version="1.0" encoding="UTF-8"?> とで、文字コードの大文字か小文字かの違いだけなのですがどちらの方が良いのでしょうか。 同じくDTD宣言を <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> と記述しています。 XMLでは大文字と小文字を区別して扱うため必ず半角で書かなければならないとされていますが、XHTMLでマークアップされているサイトのソースを見るとどこもXML宣言での文字コードとDTD宣言では大文字が使用されています。 細か過ぎるというのは分かっているのですが厳密にはどのような記載が正しいのでしょうか。 ※今回投稿カテゴリーの小カテゴリーにて”XML”を選択致しましたがXHTMLについての質問の場合”XML”と”HTML”どちらにするべきでしょうか。 合わせてご返答、又はご意見を頂戴できれば幸いです。

    • 締切済み
    • XML
  • XMLで改行

    XMLのファイルの中身は↓です。省略しましたが。 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE MOVIE SYSTEM "Chapter.dtd"> <CHAPTERNAME>はじめに</CHAPTERNAME>        ↑↑↑ 「はじめに」の部分に改行を入れて 「はじ めに」 と表示するにはどうしたらいいんでしょうか。 よろしくお願いいたします。

    • 締切済み
    • XML
  • GoogleChromeでxml宣言が消える?

    GoogleChromeでソース表示を行うと1行目に表示されるはずのxml宣言が表示されません。 例えばIE7で神奈川県のサイト(http://www.pref.kanagawa.jp/)をソース表示すると <?xml version="1.0" encoding="Shift_JIS"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja"> となりますが、同じサイトをGoogleChromeでソース表示すると <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja"> と1行目にあるはずのxml宣言が消えて2行目の空行から始まっています。 だからなんだと言われると困るのですが・・・IE6対策でphpの条件分岐でIE6以外の場合のみ表示としているはずが、あれ?と言う状況です。 ソースや表示そのものがおかしくなるわけではないと思いますが、最初は条件分岐が間違っているのかと悩みました。 これはきちんと表示させる方法があるのか、もしくはそういう仕様なのか、実は他のソースもちゃっかり修正されちゃってたりしないのか、どんなもんでしょう。

    • ベストアンサー
    • HTML
  • XMLの処理について

    javaでxmlをsoapで投げる処理をしています。 <クライアント> DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = dbf.newDocumentBuilder(); Document doc = builder.parse( new File( "test.xml" ) ); Element elm = doc.getDocumentElement(); result = WebService( elm ); <サーバ> public Object WebService( Element elm ) { return 'elmを処理した結果'; } このクライアントの処理をperlで行いたいのですが、可能でしょうか?  : $service = SOAP::Lite->Service( "xxx.wdsl" ); open( XML, "test.xml" ); @xml = <XML>; ?? ここの処理はどうすれば ?? result = $service.WebService( @xml );  :

  • xml宣言をしたら・・・

    XHTML+CSSを勉強中なのですが、下記のソースを見てください。 <?xml version="1.0" encoding="Shift_JIS"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja"> <head> -----------省略------------- </head> <body> <div id="container"> -----------省略------------- </div> </body> </html> xml宣言をするまでは画面中央に表示されていたのですが、宣言の行を追加したら左側に寄ってしまいました。 CSS部分は以下のようになっています。 body { font-size: 100%; font-family: sans-serif; color: #333333; margin: 0; padding: 0; background-color: #F0F0F0; } #container { width: 800px; position: relative; margin: 0 auto; background-color: #FFFFFF; } marginの設定の仕方が悪いのかなとか考えたんですが、わかりませんでした。 用は<table align="center">のようなことがしたいんです。 どなたかご教授よろしくお願いします。

    • ベストアンサー
    • XML
  • DTDを記述する意味

    DTDを使ってXMLの形式を厳密に定義する方法があると聞いて試してみたのですが、記述した形式を破っても何も起きません。たとえば以下のように <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE root [ <!ELEMENT root (a, b, c+)> ]> <root> <b>BBB</b> <a>AAA</a> </root> と書いた場合、「A,B,Cという要素をこの順番で配置せよ」という命令と「Cという要素を1つ以上配置せよ」という2つの命令を無視していますが、何かしらのエラーを返すといった動作は全くありません。HTML(XHTML)みたいな感じです(テキトーにコーディングしてもエラーを返さない点)。XMLのDTDはそれを守らないとエラーを返すような動作はしないのでしょうか?それではDTDの存在意義が分からなくなってしまいますが・・・

    • 締切済み
    • XML
  • XML宣言について

    htmllintでエラーチェックをしたら、 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "​http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">​ <html xmlns="​http://www.w3.org/1999/xhtml"​ xml:lang="ja" lang="ja"> にはXML宣言をいれろとでたので <?xml version="1.0" encoding="Shift_JIS"?>を入れました。 しかし、下記cssの設定でセンター揃えの設定をしていたのに 左よりになってしまいました。 XML宣言を取ると元のセンター揃えに戻りましたがXML宣言はいれない 方がよいのでしょうか?入れてもセンター揃えになりますか? css---------------ーーーーーーーーーーー * {1 margin: 0; padding: 0; } body { margin: 0px; padding: 0px; background-color:#f0fbff; height:100%; font-size: 13px; } html{ height:100%; } #wrapper { background-color:#fff; margin:0px auto; padding:0px; width:848px; height:100%; min-height:100%; border-left:1px solid #b8b8b8; border-right:1px solid #b8b8b8; } body > #wrapper { height:auto; }

    • ベストアンサー
    • HTML
  • Perl での XML 置換について

    perl で XML::LibXML モジュールを使用して下記のようなXMLのテキスト部分の置換をしようとしています。 <item id="1"> <name>hoge</name> <description> テスト<b>テスト</b>テスト </description> </item> <item id="2"> <name>hoge2</name> <description> テスト2<i>テスト2</i>テスト2 </description> </item> これに対して、 for $node ($dom->findnodes('//item/description/text()')){ $text = $node->toString; $text =~ s/.../.../; $node->setData($text); } のように置換する処理を考えたのですが、description の中に <b> や <i> のようなインライン要素があると正しく置換、書き戻しがされません(置換対象は、これらインライン要素の中にも外にもあります)。 これをなんとか正常に動作させる方法はあるでしょうか。 どうぞ、よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • IEでXMLとDOCTYPEの関係

    PukiWikiのスキンをカスタマイズしていて、困っております。。 PukiWikiでは、HTMLの先頭に、以下のような3行が入るのですが・・・ <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja"> IEでは、DOCTYPEが1行目にないと有効にならないようなのです。。 先頭の「<?xml・・・」は、必ずないといけないのでしょうか?「<?xml・・・」と「<!DOCTYPE・・・>」を入れ替えたりしては、不都合があるのでしょうか?

    • ベストアンサー
    • HTML
  • DTDファイルをクラスパスから読み込みたい

    DTDを利用したXMLファイルを読み込むDOMパーサーを作ってます。 表題のとおり、DOMパーサーがXMLファイル、DTDファイルを読み込む際に DTDファイルをローカルマシン(実行環境)のクラスパスにあるディレクトリ から読み込みたいのですがうまくいきません。 XMLパーサーにxercesを利用し、DOMを使ってます。 例えば、 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE pagecontrol SYSTEM "sample.dtd"> <PEOPLE> <NAME>afternoon_cafe</NEME> </PEOPLE> のようなXMLファイルを、DOMパーサーがparse()メソッドによりロード すると、"sample.dtd"をカレントディレクトリからしか検索しません。 この"sample.dtd"をクラスパスにあるディレクトリに置き、それを 読み込むようにしたいのですが、、、 どなたかわかる方がいれば、教えてください。 お願いします。

    • ベストアンサー
    • XML