PerlでのXML置換について

このQ&Aのポイント
  • PerlでXML::LibXMLモジュールを使用してXMLのテキスト部分の置換を行いたいです。置換処理をする際に、<b>や<i>のようなインライン要素が含まれている場合に正しく置換されない問題が生じています。この問題を解決する方法はありますか?
  • XML::LibXMLモジュールを使用してPerlでXMLのテキスト部分を置換しようとしています。しかし、インライン要素がある場合に正しく置換されず、書き戻しがされません。どのようにすれば正常に動作させることができるでしょうか?
  • PerlのXML::LibXMLモジュールを使用してXMLのテキスト部分を置換する処理を考えています。しかし、インライン要素が含まれている場合に正しい結果が得られません。解決策があれば教えてください。
回答を見る
  • ベストアンサー

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
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

XPath の書き方なんてほとんど忘却の彼方なんだけど, //item/description/text() だと 「『item要素の子供である description要素』の子供であるテキスト部分」 ってことにならないかなぁ. つまり, XPath で 「『item要素の子供である description要素』の子孫であるテキスト部分」 を指定すればいいような気がする... けど, //item/description//text() みたいにかけるんだっけ?

dokuso007
質問者

お礼

//item/description//text() 期待した通りの結果を得ることができました。 大変助かりました、ありがとうございます!

関連するQ&A

  • perl XMLの入れ子取得方法

    下記のようなツリー状のXMLから、親となっている情報と子の情報を分けて取得したいのですが、testプログラムで、子だけは取れましたが親の情報だけ取り出す方法が分かりません。どなたか取得方法、サンプルなどを教えていただけないでしょうか? --------------------------------------- <?xml version="1.0" encoding="UTF-8"?> <rss version="2.0" xmlns:review="http://www.test.com/"> <channel> <title>test</title> <language>ja</language> <item> <number>1</number> <title>親レビュータイトル</title> <item>  <number>3</number>  <title>子レビュー2タイトル</title> </item> <item>  <number>2</number>  <title>子レビュー1タイトル</title> </item> </item> </channel> </rss> ---------------------------------------    #testプログラム #!/usr/local/bin/perl use XML::LibXML; #$rss は上記のXMLの内容 $parser = XML::LibXML->new; $doc = $parser->parse_string($rss); @nodes = $doc->findnodes ( "//*[local-name()='item']/*[local-name()='item']" ); for $node (@nodes){ $item ->{'number'} = Henkan::henkan( "-Wexm0",$node->findvalue("./number/text()")); $item ->{'title'} = Henkan::henkan( "-Wexm0",$node->findvalue("./title/text()")); print "[$item ->{'number'}]\n"; print "[$item ->{'title'}]\n"; } ---------------------------------------

  • PHPでXMLの置換 replaceData

    PHPのXML操作で、すでにあるXMLの置換をしたいと思っています。 $doc=DOMDocument::load('test.xml'); $hoge=$doc->getElementsByTagName('hoge')->item(0)->firstChild; $hoge->replaceData(0,1000,$_POST['hogehoge']); このような感じで置換はできるのですが、 中身が空の場合は置換できずにエラーになってしまいます。 単純にappendDataやinsertDataにすればいいのかと思ったのですが それでもエラーになってしまいます。 こういう場合はどういう対処をすればいいのでしょうか? そもそも空というのがあるのはいけないのでしょうか・・・? どうぞよろしくお願いいたします。

    • ベストアンサー
    • PHP
  • domでのXML作成について

    PHP4.2のdomを使い、下記のようなXMLを作成したいです。 しかし、Itemのノードに対して、NUMBERとNAMEという子ノードを2つつけるやり方が分からず困っています。 PHPは書いて見たのですが、上手くいっていません。 教えていただけると助かります。 宜しくお願いします。 【作成したいXML】 <Response> <Items> <Item> <NUMBER>47</NUMBER> <NAME>沖縄県</NAME> </Item> </Items> </Response> 【PHP】 $dom = domxml_new_doc("1.0"); $Response = $dom->create_element("Response"); $root = $dom->append_child($Response); $Items = $dom->create_element("Items"); $Item = $dom->create_element("Item"); $NUMBER = $dom->create_element("NAME"); $text1 = $dom->create_text_node("47"); $NUMBER->append_child($text1); $NAME = $dom->create_element("NAME"); $text2 = $dom->create_text_node("沖縄"); $NAME->append_child($text2); $Item->append_child($NAME); $Items->append_child($Item); $root->append_child($Items);

    • ベストアンサー
    • PHP
  • xml

    今契約してるサーバーがSQLをつけるとものすごい金額になってしまうので。XMLに挑戦中です。 作ってみたのですが、ソースが間違ってる?のか表示できません、教えてください. name.xml <?xml version="1.0" encoding="shift-jis"?> <test no="1"> <name>test</name> <no>10</no> <tel>123-456-789</tel> </test> test.php <html> <head> <title>sample1</title> </head> <body> <?php $doc->load("name.xml"); $name = $doc->selectSingleNode("test"); $list = $name->selectNodes("*"); $no = $list->item(1); $text = " 番号 " . $no . "<br>"; print $text; ?> </body> </html>

    • ベストアンサー
    • PHP
  • クイズ作成に関して xml形式の問題をランダムに読み込む方法

    現在、クイズを作っています。 外部のXMLファイルから問題を読み込み、それをランダムに5問出題させ、さらに重複させないようにしたいのですが、経験不足のため思うように出来ません。 flashファイル  //////////////////////////////////// var a_xml:XML = new XML(); a_xml.onLoad = function() { var top:XMLNode = a_xml.firstChild; for(i = 0; i<top.childNodes.length;i++){ var item:XMLNode = top.childNodes[i]; trace(item.attributes.name); } } a_xml.ignoreWhite = true; a_xml.load("xml/test.xml"); //////////////////////////////////// XMLファイル test.xml //////////////////////////////////// <?xml version="1.0" encoding="UTF-8"?> <items> <item name="test1" value="0" /> <item name="test2" value="1" /> <item name="test3" value="2" /> <item name="test4" value="3" /> <item name="test5" value="4" /> <item name="test6" value="5" /> </items> //////////////////////////////////// XMLファイルの読み込みは何とかできたのですが、ここからどうやってランダムに読み込むかが分かりません。 XML要素のnameをランダムで出題したい場合どうしたらいいのですか? ここから先は、多分Math.randomを使うのだろうというレベルでしか分からないため、なんとかご教授お願いできませんか? 環境はwin,FlashMX2004です。

    • ベストアンサー
    • Flash
  • XMLのエラー

    XMLのエラー RSS作りの勉強のため、XMLを作成していったんローカルフォルダに保存したあと、IE8でテスト表示してみたるとこんなエラーが出ます。↓↓ XML ページを表示できません XSL スタイル シートを使用した XML 入力は表示できません。エラーを訂正してください。 [更新] ボタンをクリックするか、または後でやり直してください。 -------------------------------------------------------------------------------- テキストの内容に無効な文字が見つかりました。リソース 'file:///(ファイルの保存場所)' の実行エラーです。 XMLの文は下です。 <?xml version="1.0" encoding="utf-8" ?> <rss version="2.0"> <channel>   <title>RSS2.0 Test</title>   <link>(適当なリンク先)</link>   <description>RSS2.0のテスト</description>   <language>ja</language>   <item>    <title>ページ1</title>    <link>(適当なリンク先)</link>    <description>1つ目のページ</description>    <pubDate>Mon, 20 Jul 2010 00:00:00 +0900</pubDate>   </item>   <item>    <title>ページ2</title>    <link>(適当なリンク先)</link>    <description>2つ目のページ</description>    <pubDate>Tue, 21 Jul 2010 03:04:05 +0900</pubDate>   </item> </channel> </rss> よろしくお願いします。

    • ベストアンサー
    • XML
  • XML DOMについて

    JavaScriptでDOMを使用して、xmlhttp.sendで指定のPHPファイルに送信しましたが、 PHP側で値を取得できません。 (PHP Ver.5.3.0) 以下、JavaScript var UserID="abc"; var Password="abc"; var xmlDoc = new ActiveXObject("Microsoft.XMLDom"); xmlDoc.appendChild(xmlDoc.createProcessingInstruction("xml","version=\"1.0\"")); var root = xmlDoc.createElement("xDoc"); xmlDoc.documentElement=root; var node_Item = xmlDoc.createElement("Command"); root.appendChild(node_Item); var node_UserID = xmlDoc.createElement("UserID"); node_UserID.appendChild(xmlDoc.createTextNode(UserID)), node_Item.appendChild(node_UserID); var node_Password = xmlDoc.createElement("Password"); node_Password.appendChild(xmlDoc.createTextNode(MDString(Password))), node_Item.appendChild(node_Password); var node_Sufix = xmlDoc.createElement("Sufix"); node_Sufix.appendChild(xmlDoc.createTextNode(Sufix)), node_Item.appendChild(node_Sufix); var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); xmlhttp.open("post",topURL("main/Log.php"),false); xmlhttp.send(xmlDoc); 以下、Log.php <?php session_start(); $DEBUG_MODE=false; $xmlLogQ=$_SERVER['DOCUMENT_ROOT']."/test/temp/Request.xml"; $xml = new DOMDocument(); $xml->async=false; if (!$DEBUG_MODE) { if ($XML_LOG) { $xml->save($xmlLogQ); } } else { if ($XML_LOG) { $xml->load($xmlLogQ); } } $doc=$xml->documentElement; if ($xml->parseError.errorCode==0) { $xml = $node=$doc->selectSingleNode("Command/UserID"); if (!($node==null)) { $UserID=$node->text; $node=null; } $node=$doc->selectSingleNode("Command/Sufix"); if (!($node==null)) { $Sufix=$node->text; $node=null; } $node=$doc->selectSingleNode("Command/Password"); if (!($node==null)) { $Password=$node->text; $node=null; } } ?> 保存したXML上、<?xml version="1.0"?>以降書き込みできてません。 どの部分がおかしいか不明の為、申し訳ないですがご教授お願いします。

    • ベストアンサー
    • PHP
  • XMLの要素の内容の中に要素

    VisualBasic6.0にて、XMLを作成するプログラムを作っています。 XMLの作成、編集はMSXMLを使用しており、編集保存はできたのですが、下記のような要素の出力の仕方がわかりません。 <Node1>  あいうえお  <Node1-1>abcde</Node1-1>  かきくけこ </Node1> このように要素の文字列の途中に子要素を作成したいです。 「Node1」要素に、子要素「Node1-1」を追加するサンプルです。 Cドライブ直下に以下の内容のXMLファイル「test.xml」を作成 <?xml version="1.0" encoding="shift_jis"?> <Node1> </Node1> VB6にて、参照設定に「Microsoft XML V6.0」を追加し以下のコードを作成。 Private Sub Command1_Click() Dim xDoc As MSXML2.DOMDocument Set xDoc = New MSXML2.DOMDocument Dim node As IXMLDOMNodeList Dim Addnode As IXMLDOMNode Dim obj As IXMLDOMNode If xDoc.Load("C:\test.xml") Then Set node = xDoc.documentElement.selectNodes("/Node1") For Each obj In node Set Addnode = obj.appendChild(xDoc.createNode(NODE_ELEMENT, "Node1-1", "")) Addnode.Text = "abcde" Next xDoc.save ("C:\test.xml") End If Set xDoc = Nothing End Sub

  • rexmlで・・・

    Ruby初心者です。 rexmlを用いてXMLを扱うことになったのですが、出力がうまくいきません。 XMLファイル <hoge> <item> <name>○○○</name> <data>・・・・・</data> <data>・・・・・</data> </item> <item> <name>○○○</name> <data>・・・・・</data> <data>・・・・・</data> </item> </hoge> 上記のようなXMLファイルから<name>と<data>を取り出して出力しようと思っています。 見よう見まねで以下のようなコードを書いたのですが、これだと複数ある<data>が1つしか取れませんでした。 xml = REXML::Document.new(open("・・・・")) xml.elements.each("hoge/item") {|line| puts line.elements["name"].text puts line.elements["data"].text } ※都合で簡単に書き直したものをテストせずに載せています すべての<data>を出力したいのですが、どう書き直せばよいでしょうか? ご教授願います。

    • ベストアンサー
    • Ruby
  • 正規表現のパターン

    <value:type>1</value:stype> <item:img url="http://hoge/"></item:img> <description>hogehoge hogehoge </description> みたいなXMLの「value:」と「item:」を「」に置換(消す)して、「description」の改行文字を削除したいのですが、どのようなパターンになるのでしょうか?

専門家に質問してみよう