Python Ruby中XML的解析与处理

Python Ruby中XML的解析与处理,python,ruby,xml,Python,Ruby,Xml,所以我有一个小XML文档,foobar.XML <?xml version="1.0" standalone="no"?> <!DOCTYPE foo SYSTEM "bar.dtd"> <title _FORMAT="XXX.XXX" _QUANTITY="1" _DEVICENAME="XXX" _JOBNAME="FOOBAR"> <subtitle> <variable name="x">A-1234567<

所以我有一个小XML文档,foobar.XML

<?xml version="1.0" standalone="no"?>
<!DOCTYPE foo SYSTEM "bar.dtd">
<title _FORMAT="XXX.XXX" _QUANTITY="1" _DEVICENAME="XXX" _JOBNAME="FOOBAR">
    <subtitle>
    <variable name="x">A-1234567</variable>
    </subtitle>
</title>
这是我第一次用Ruby处理XML,但我没有真正理解语法。我的目标基本上是复制Python,通过更改循环每次迭代的节点文本,然后将其写入XML文件。非常感谢您的任何建议。

我更喜欢用Ruby解析XML;它使用起来既快速又高效(如果您愿意,还可以使用CSS样式选择器而不是XPath):

需要“nokogiri”
$number=3
$start=134341
my_xml=IO.read('foobar.xml')
doc=Nokogiri::XML(my_XML)
doc.css('variable')。每个do | el|
$number.times做什么
#将pad设置为7位数字:请参见'ri Kernel#sprintf`
el.content=“A-%07d”%$start
open(“foobar-#{$start}.xml,'w')do|f|

为了完整起见,这里有一个基于REXML的解决方案:

require 'rexml/document'
$number = 3
$start  = 1312

doc = REXML::Document.new(my_xml)
REXML::XPath.each(doc,'//variable') do |el|
  $number.times do
    el.text = "A-%07d" % $start
    File.open( "f-#{$start}.xml", 'w' ){ |f| f << doc }
    $start += 1
  end
end
需要“rexml/文档”
$number=3
$start=1312
doc=REXML::Document.new(我的xml)
REXML::XPath.each(doc,//variable)do | el|
$number.times做什么
el.text=“A-%07d”%$start

open(“f-#{$start}.xml,'w'){| f | f如果您使用xpath表达式
//variable
在文档的任何深度查找名为“variable”的所有元素,您可以使用REXML做与上述非常类似的事情。感谢您的努力。有其他选择吗?我无法让Ruby使用nokogiri。更新:Phrogz,它终于起作用了。当然,我必须添加“需要‘rubygems’”。非常感谢。@mbm,那是因为您使用的是Ruby<1.9。Rubies>1.9自动
为您包含‘rubygems’
。噢,您的Python正在显示!:-)在Ruby中,如果参数括号为空,我们可以忽略它们。
。each()
可以更简单地编写
每个
。使用范围,但是
对于0中的z…$number
通常是
0。最多($number-1)do | z | end
(0…$number)。每个
$number.times
或主题上的其他变体。我不确定你对“for”中的内容有何看法“循环,但您应该查看,尤其是
*
选项,如
%*0d
中的选项,因为它看起来像是在进行一些“0”填充。
doc = Document.new(File.new("foobar.xml"))
doc.elements.each() do |element|
  element.elements.each() do |child|
    child.elements.each() do |sub| # probably wrong
      for z in 0...$number
        if $start.to_s.length == 7 
          accession = "A-" + $start.to_s
        else
          accession = "A-" + ("0" * (7 - $start.to_s.length)) + $start.to_s
        end
      $start += 1
      # need to assign here and write to file or assign to variable
      end
    end
  end
end
require 'nokogiri'
$number = 3
$start  = 134341

my_xml = IO.read('foobar.xml')
doc = Nokogiri::XML(my_xml)
doc.css('variable').each do |el|
  $number.times do
    # Pads to a 7-digit number: see `ri Kernel#sprintf`
    el.content = "A-%07d" % $start
    File.open( "foobar-#{$start}.xml", 'w' ) do |f|
      f << doc
    end
    $start += 1
  end
end
require 'rexml/document'
$number = 3
$start  = 1312

doc = REXML::Document.new(my_xml)
REXML::XPath.each(doc,'//variable') do |el|
  $number.times do
    el.text = "A-%07d" % $start
    File.open( "f-#{$start}.xml", 'w' ){ |f| f << doc }
    $start += 1
  end
end