RubyのREXMLを使用してXMLを読み込む方法

このQ&Aのポイント
  • RubyのREXMLを使用してXMLを読み込む方法について教えてください。
  • XMLをShift-JISでエンコーディングしている場合、REXMLを使用して出力すると文字化けすることがあります。
  • 日本語で正しく出力するためには、出力時に適切なエンコーディングを指定する必要があります。
回答を見る
  • ベストアンサー

Ruby の rexml について教えてください。

# encoding: Shift_JIS =begin Filename: db.xml Contents: <?xml version="1.0" encoding="Shift-JIS"?> <Root Text="frog256"> <Customer Text="顧客名001"> <Business Text="業務名001" /> <Business Text="業務名002" /> <Business Text="業務名003" /> <Business Text="業務名004" /> <Business Text="業務名005" /> <Business Text="業務名006" /> <Business Text="業務名007" /> </Customer> </Root> =end require "rexml/document" oDoc = REXML::Document.new(File.open("db.xml")) oDoc.elements.each("/Root/Customer/Business") do |element| p element.attributes["Text"] end 上記のようなコードで実行すると、出力が、 "\u696D\u52D9\u540D001" "\u696D\u52D9\u540D002" "\u696D\u52D9\u540D003" "\u696D\u52D9\u540D004" "\u696D\u52D9\u540D005" "\u696D\u52D9\u540D006" "\u696D\u52D9\u540D007" このようになってしまいます。 普通に日本語で出力するには、どうしたらよいでしょうか? よろしくお願いします。

  • Ruby
  • 回答数1
  • ありがとう数2

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

  • ベストアンサー
回答No.1

文字化けするのはrexmlの内部でエンコーディングが変わっているからでは。多分utf-8になっていると思います。それでkconvのtosjisを使ってp emement ...のところをputs element...tosjisとするときれいに出てきますよ。つまりこんな感じです。 require 'kconv' require "rexml/document" oDoc = REXML::Document.new(File.open("db.xml")) oDoc.elements.each("/Root/Customer/Business") do |element| puts element.attributes["Text"].tosjis end

den256
質問者

お礼

うまく行きました。ありがとうございました。

関連するQ&A

  • ruby+xml 特定の属性値をもつ要素の求め方

    宜しくお願いします。 ↓のようなxmlファイルがあり、 #########hoge.xml############# <root> <a name="a1"> <b>bbb1</b> <b>bbb2</b> <b>bbb3</b> <c>ccc1</c> </a> <a> <b>bbb4</b> <b>bbb5</b> </a> <a name="a3" price="100"></a> </root> ###################### ↓と同じ処理をしたいのですが、 doc = REXML::Document.new(open("hoge.xml")) doc.elements.each("root/a[@name='a1']/b") do |element| ... end a1が変数名の場合、 どのように記述したらよいのでしょうか。 doc = REXML::Document.new(open("hoge.xml")) attr = a1 doc.elements.each("root/a[@name='????????']/b") do |element| ... end 基本的な内容で申し訳ありませんが、 宜しくお願いします。

    • ベストアンサー
    • Ruby
  • 内容にテキストを持つタグの属性をXMLSchemaで表現するには?

    すみませんXML初心者です。質問をさせてください。 以下に示すXML文書についてのXMLSchemaは、どのように表現したらよいのでしょうか?教えてください。 よろしくお願いします。 <?xml version="1.0" encoding="Shift_JIS" ?> <root> <sub a="a">テスト</sub> </root>

    • ベストアンサー
    • XML
  • XSLで、XMLの空タグを制御したい。

    値がないXML文書に、 <exsample /> こう書かれてしまうものを、 <exsample></exsample> このように出力したいのですが、出来ずでした。 以下は、私のやり方です。 ■ XSL <?xml version="1.0" encoding="Shift_JIS"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xalan="http://xml.apache.org/xslt"> <xsl:output method="xml" encoding="Shift_JIS" indent="yes" xalan:indent-amount="4"/> <xsl:template match="/"> <xsl:copy-of select="."/> </xsl:template> </xsl:stylesheet> ■ XML <?xml version="1.0" encoding="Shift_JIS"?> <root> <section> <category> <exsample1>value</exsample1> <exsample /> </category> </section> </root> ご教授、よろしくお願いいたします。

    • ベストアンサー
    • XML
  • XMLファイルからXML Schemaを参照する方法?

    XMLファイルの設計をしています。 今まではDTDを使っていたのですが、 勉強するとXML SchemaのほうがXMLの規則にそっていたり、 データ型が多かったりして都合が良い面があると学びました。 そこでXML Schemaを使いたいと思うのですが、 XML SchemaとメインのXMLのファイルはどのように関係させたら良いのでしょうか? DTDのときは以下のように書いていたと思います。 <!DOCTYPE root SYSTEM "sample.dtd" > このような記述をXML Schemaのときには、どのように記載するのだろうと 疑問に思いました。 私なりに調べてみたのですが、 XML Schemaの記述方法は、大まかに理解したのですが、 関係方法をどうすれば良いかは、見つけられませんでした。 本を読んでも、書かれているように思えません。 以下の2つのファイルがあった場合、 【element1.xml】は妥当なXML文書だそうですが、 どのように関連付いているのでしょうか? 【element.xs】 <?xml version="1.0" encoding="Shift_JIS" ?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <!-- 要素宣言 --> <xs:element name="売上高" type="xs:integer" /> </xs:schema> 【element1.xml】 <?xml version="1.0" encoding="Shift_JIS" ?> <売上高>1000</売上高> もしよろしければ、教えて頂けませんか? ぜひご教示お願いいたします。

    • ベストアンサー
    • XML
  • UTF-8の「~」をsjisにencodeすると「?」になってしまいます

    <?xml version="1.0" encoding="UTF-8" ?> <root> <data>あ~お</data> </root> というようなXMLをXML::Simpleでparseし、 use Encode; $data = encode("sjis", $xmldata); のようにsjisにエンコードしてhtmlで表示させたところ、 「あ~お」の「~」のところが「?」になってしまいます。 これを「あ~お」と表示するにはどうしたらよいでしょうか。 表示する方のHTMLのコードはShift_JISでなければなりません。 アドバイスのほど、よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • XMLの読み込み

    DocumentBuilderFactory,DocumentBuilder等を使って XMLドキュメントの読み込みを行っています。 例えば、以下の様なXMLドキュメントがあった時 <text>内の読み込みを行うと、テキストテキスト2と なってしまいます。 「テキスト<p/><p/>テキスト2」として取得したいのですが 何かいい方法ないでしょうか? ----------------------------------------- <?xml version="1.0" encoding="Shift_JIS"?> <root> <text> テキスト<p/><p/>テキスト2</text> </root> ----------------------------------------- それとも、XMLドキュメント上、「<p/>」に意味があるのでしょうか? ※プログラム一部抜粋 //-- DOMオブジェクト初期化 DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder(); //-- XMLファイル読み込み this.doc = docBuilder.parse(new File(strPath)); this.doc.getDocumentElement().normalize();

    • ベストアンサー
    • Java
  • FirefoxでのXML外部実体参照について。

    FirefoxでのXML外部実体参照について。 XMLをイチから勉強しているのですが、外部実体参照のところで分からなくなってしまいました。 <!ENTITY [要素名] SYSTEM "[ファイルパス]"> で外部ファイルを読み込もうとしているのですが、これがIE8なら期待通りに(外部ファイルを読み込んで)動いてくれるのですが、Firefox3だと動いてくれません。 ソースは以下の通りです。 ----------------------------------------- [members.xml] <?xml version="1.0" encoding="Shift_JIS"?> <!DOCTYPE members SYSTEM "members.dtd" [ <!ENTITY member1 SYSTEM "member1.xml"> ]> <members> &member1; </members> ----------------------------------------- [members.dtd] <!ELEMENT members (member)*> <!ELEMENT member (name, sex)> <!ELEMENT name (#PCDATA)> <!ELEMENT sex (#PCDATA)> <!ATTLIST member id ID #REQUIRED> ----------------------------------------- [member1.xml] <?xml version="1.0" encoding="Shift_JIS"?> <member id="0001"> <name>Tarou.Nihon</name> <sex>Male</sex> </member> ----------------------------------------- FirefoxとIEの間に何か違いがあるのでしょうか。 あと、<!ELEMENT>ですが、 <!ELEMENT members (member)*> と書くのと、 <!ELEMENT members (member*)> と書くのでは何か違いがあるのでしょうか。 以上2点、詳しい方がいればお教え下さい。宜しくお願い致します。

    • ベストアンサー
    • XML
  • VBAでXMLを出力するプログラムを作成する際の名前空間接頭辞の付与の仕方について

    今、Excel付属のVBAを使用して、XMLを作成するプログラムを作成しております。 その際、名前空間(及び接頭辞)を付与したいのですが、方法が分からず苦慮しております。 VB.NET等での方法はわかったのですが、職場の開発環境上、VBAでなんとか対応したいところです。 もし何かご存知の方、いらっしゃいましたら、どうか教えていただきたく、よろしくお願いいたします。 ===作成したいXML=== <?xml version="1.0" encoding="Shift_JIS" ?> - <Root> - <YOUSO xmlns:BBB="http://aaa.aa.aaa"> <YOSO2>AAAAAAA</YOSO2> </YOUSO> </Root> ===現在このようなXMLになってしまっております。=== <?xml version="1.0" encoding="Shift_JIS" ?> - <Root> - <YOUSO xmlns="http://aaa.aa.aaa"> <YOSO2 xmlns="">AAAAAAA</YOSO2> </YOUSO> </Root> ===作成したコード=== Sub TEST() Dim xmlDoc As MSXML2.DOMDocument Dim xmlPI As IXMLDOMProcessingInstruction Dim node(3) As IXMLDOMNode Set xmlDoc = New MSXML2.DOMDocument 'XML宣言 Set xmlPI = xmlDoc.appendChild(xmlDoc.createProcessingInstruction("xml", "version=""1.0"" encoding=""Shift_JIS""")) '<Root>要素 Set node(1) = xmlDoc.appendChild(xmlDoc.createNode(NODE_ELEMENT, "Root", "")) '<YOSO1>要素 Set node(2) = node(1).appendChild(xmlDoc.createNode(NODE_ELEMENT, "YOUSO", "http://aaa.aa.aaa")) '<YOUSO2>要素 Set node(3) = node(2).appendChild(xmlDoc.createNode(NODE_ELEMENT, "YOUSO2", "")) node(3).Text = "AAAAAAA" 'XMLドキュメントの出力 xmlDoc.Save ("customer.xml") End Sub ============================ よろしくお願いいたします。

  • ホームページビルダー encoding

    ホームページビルダーでホームページをW3Cで作っていますが、 どうしても、 <?xml version="1.0" encoding="Shift_JIS"?>のencodingを UTF-8にしたいのに、変わってくれません。 UTF-8にしても、保存すると勝手にShift_JISになってしまいます。 書き換えることはできますか?

  • XMLの属性について。

    XML,DTD,XSLの勉強をしています。 最終的に写真が表示され、その下に「PM 7:30」もしくは「19:30」と表示するようなページを作ろうと思っているのですが、属性の意味がよく理解できておらず下の3つのうちどれを採用したらいいか悩んでいます。どれが正解というか、どれを選ぶのがいい方法なんでしょうか? また、その理由(属性について)教えて頂けないでしょうか?具体的には次の2つが疑問点です。 1. 写真を表示するのに、写真のアドレスを属性にする理由はなんとなく分かるような気がするにですが、いまいちはっきりした理由が理解できていません。 DTDを<!ELEMENT アルバム (#PCDATA) >にして、XMLを<アルバム>0101.jpg</アルバム>でも写真の表示は可能なのでしょうか? 2. 一番の疑問点なのですが、時間を(#PCDATA)にするのか、EMPTYにして属性で CDATA にするべきなのかがよく分かりません。 (「分」も属性値にしてしまった方がいいのでしょうか?) (xslは、まだ作成していません。) よろしくお願い致します。 具体例↓ 3つ 「arubamu.dtd」 <?xml version="1.0" encoding="Shift_JIS"?> <!ELEMENT アルバム (時,分) > <!ATTLIST アルバム file CDATA #REQUIRED > <!ELEMENT 時 EMPTY > <!ATTLIST 時 ampm (am|pm) "am" > <!ATTLIST 時 time CDATA #REQUIRED > <!ELEMENT 分 (#PCDATA) > 「アルバム.xml」 <?xml version="1.0" encoding="Shift_JIS"?> <!DOCTYPE アルバム SYSTEM "arubamu.dtd"> <アルバム file = "0101.jpg" > <時 ampm = "pm" time = "7" /> <分>30</分> </アルバム> ------------------------------------------------------------------ 「arubamu2.dtd」 <?xml version="1.0" encoding="Shift_JIS"?> <!ELEMENT アルバム (時) > <!ATTLIST アルバム file CDATA #REQUIRED > <!ELEMENT 時 EMPTY > <!ATTLIST 時 ampm (am|pm) "am" > <!ATTLIST 時 time CDATA #REQUIRED > <!ATTLIST 時 minute CDATA #REQUIRED > 「アルバム2」 <?xml version="1.0" encoding="Shift_JIS"?> <!DOCTYPE アルバム SYSTEM "arubamu2.dtd"> <アルバム file = "¥0101.jpg" > <時 ampm = "pm" time = "7" minute = "30" /> </アルバム> ------------------------------------------------------------------- 「arubamu3.dtd」 <?xml version="1.0" encoding="Shift_JIS"?> <!ELEMENT アルバム (時,分) > <!ATTLIST アルバム file CDATA #REQUIRED > <!ELEMENT 時 (#PCDATA) > <!ATTLIST 時 ampm (am|pm) "am" > <!ELEMENT 分 (#PCDATA) > 「アルバム3.xml」 <?xml version="1.0" encoding="Shift_JIS"?> <!DOCTYPE アルバム SYSTEM "arubamu3.dtd"> <アルバム file = "0101.jpg" > <時 ampm = "pm">7</時> <分>30</分> </アルバム>

    • ベストアンサー
    • XML

専門家に質問してみよう