как обрабатывать элементы XML, которые могут или не могут быть повторены с использованием объекта XML - PullRequest
0 голосов
/ 13 марта 2012

Я использую гем xml-object для обработки XML.Некоторые элементы в XML-документе, который мы получаем, могут повторяться или не повторяться.Когда они появляются только один раз, xml-объект связывает их как свойство, не являющееся массивом, но когда они появляются более одного раза, они связываются как массив.Я бы предпочел обращаться с ними так, как будто они всегда связаны как массив.Это должно объяснить то, о чем я говорю:

!/usr/bin/env ruby
require 'rubygems'
require 'xml-object'

XML_ONE = <<END
<foo>
  <bar baz="123">abc</bar>
</foo>
END

foo = XMLObject.new(XML_ONE)
puts foo.bar
puts foo.bar.baz

XML_TWO = <<END
<foo>
  <bar baz="123">abc</bar>
  <bar baz="456">def</bar>
</foo>
END

foo = XMLObject.new(XML_TWO)
puts foo.bar[0]
puts foo.bar[0].baz

Что я хотел бы сделать, это обработать XML в форме XML_ONE, идентичной XML в форме XML_TWO.Я попытался сделать это:

puts [*foo.bar][0]
puts foo.bar.to_a[0]
puts [*foo.bar][0].baz
puts foo.bar.to_a[0].baz

Первые две строки вывести «abc».Вторые два терпят неудачу, жалуясь, что нет никакого метода "baz" на "abc".Из того, что я могу сказать, когда результат "foo.bar" преобразуется в массив, этот массив содержит "простую" строку, а не строку с инструментами, возвращаемую "foo.bar", которая имеет метод "baz".

Есть мысли?

1 Ответ

0 голосов
/ 13 марта 2012

Я бы попытался использовать что-то другое для разбора XML. После небольшой игры с гемом xml-object кажется, что он не соответствует типу возвращаемых объектов. Я бы использовал Nokogiri вместо этого. Я смог получить поведение, которое вы пытались использовать с этим кодом:

#!/usr/bin/env ruby
require 'rubygems'
require 'xml-object'
require 'nokogiri'

XML_ONE = <<END
<foo>
  <bar baz="123">abc</bar>
</foo>
END

XML_TWO = <<END
<foo>
  <bar baz="123">abc</bar>
  <bar baz="456">def</bar>
</foo>
END

xml1 = Nokogiri::XML(XML_ONE)
xml2 = Nokogiri::XML(XML_TWO)

puts xml1.xpath('/foo/bar/@baz')[0]
puts xml2.xpath('/foo/bar/@baz')[1]

Результаты:

123
456

Функциональность, аналогичная XMLObject, существует и в Nokogiri через Nokogiri::Slop, но она была такой же непоследовательной, как и XMLObject, поэтому я решил использовать Nokogiri::XML().xpath вместо нее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...