Разбор и обработка XML в Ruby - PullRequest
       3

Разбор и обработка XML в Ruby

2 голосов
/ 08 декабря 2010

Итак, у меня есть небольшой 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>

и немного Питона,

    with open('foobar.xml', 'rt') as f:
        tree = ElementTree.parse(f)
    # Loop over all elements in 'tree' in section order
    for node in tree.getiterator():
        if node.tag == "variable":
            for z in range(number):
                if len(str(start)) == 7:
                    accession = "A-" + str(start)
                # This simply adds leading zeros if there are < 7 digits
                elif len(str(start)) < 7:
                    accession = "A-" + ("0" * (7 - len(str(start))) + str(start))
                start += 1
                # Assign 'accession' to the node text
                node.text = accession
                tree.write("foobar.xml")
        else:
            continue

, который прекрасно находит интересующий меня тег узла и обрабатывает его путем итерации по диапазону, каждый раз заменяя текст узла и записывая XML-файл в файл. Есть только одна проблема: мне нужно, чтобы это произошло в Ruby.

Пока у меня есть

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

Это мой первый раз, когда я обрабатываю XML в Ruby, и мне не удается понять синтаксис. Моя цель - по сути реплицировать Python, изменяя текст узла для каждой итерации цикла, а затем записывая его в файл XML. Любые предложения приветствуются.

Ответы [ 2 ]

2 голосов
/ 08 декабря 2010

Я предпочитаю Nokogiri для моего XML-анализа в Ruby; это быстро и эффективно в использовании (и позволяет вам использовать селекторы в стиле CSS вместо XPath, если хотите):

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

Я изменил вышеописанное, чтобы выписать уникальный файл; конечно, вы не пишете один и тот же файл снова и снова, верно?

1 голос
/ 09 декабря 2010

Для полноты вот решение на основе 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...