1

ライブラリを使用してXMLファイルをオブジェクトのようなハッシュに解析し、変更してから、Rubyの別のXMLファイルに出力しようとすると非常に時間がかかります。私が受講しているクラスでは、XMLをオブジェクトに変換するライブラリのようなJavaJAXBを使用することになっています。すでにSAXメソッドとDOMメソッドを実行しているため、これらのXML逆シリアル化メソッドを使用することはできません。Nokogiriは、Rubyでこれらの両方を手伝ってくれました。

唯一の問題は、オブジェクトに加えている単純な変更に加えて、ファイルに書き込むときに大幅な違いがあることです。これを行うためのRubyライブラリはありますか?私が試したのは、ROXML、XML :: Mapping、およびActiveSupport::CoreExtです。実行することさえできるのはActiveSupportだけであり、それでも出力XMLに子要素として要素属性を配置し始めます。

XmlSimpleを試してみたいのですが、同じ問題が発生する前に誰かが実際にこれを実行しなければならなかったのではないかと思います。繰り返しになりますが、SAXのように一度に1行ずつ読み取ることも、DOMのようにツリーのような構造を構築することもできません。オブジェクトのようなハッシュである必要があります。

どんな助けでも大歓迎です!

4

2 に答える 2

1

nokogiriを調べる必要があります:http://nokogiri.org/

次に、次のようにXMLを解析できます。

xml_file = "some_path"
@xml = Nokogiri::XML(File.open xml_file)
@xml.xpath('//listing').each do |node| 
  style  = node.search("style").text
end

Xpathを使用すると、XMLでクエリを実行できます。

@xml.xpath("//listing[name='John']").first(10)
于 2012-04-10T07:46:51.943 に答える
1

OK、動作しました。ActiveSupport :: CoreExtのソースコードを調べたところ、xml-simpleというgemを使用していることがわかりました。厄介なのは、requireステートメントのgem、ライブラリ名、およびクラス名がハイフン付きとハイフンなしのスペルの混合であるということです。将来の参考のために、これが私がしたことです:

# gem install xml-simple
#             ^ all lowercase, hyphenated
require 'xmlsimple'
#        ^ all lowercase, not hyphenated
doc = XmlSimple.xml_in 'hw3.xml', 'KeepRoot' => true
#     ^ Camel cased (it's a class), not hyphenated
# doc.class => Hash
# manipulate doc as a hash
file = File.new('HW3a.xml', 'w')
file.write("<?xml version='1.0' encoding='utf-8'?>\n")
file.write(XmlSimple.xml_out doc, 'KeepRoot' => true)

これが誰かに役立つことを願っています。また、この宝石では大文字と小文字とハイフンに注意を払うようにしてください!!!

于 2012-04-13T01:49:54.113 に答える