2016-07-29 8 views
-1

Я использую Nokogiri с Саксом для синтаксического анализа файла XML:Nokogiri Sax Parser возвращает массив

@active_ids = Nokogiri::XML::SAX::Parser.new(IdParser.new).parse(open("https://s3.eu-central-1.amazonaws.com/redacted/client_xml.xml")) 

Внутри парсер, я строю массив идентификаторов и хотел бы вернуть их после того, как анализатор сделано:

def initialize 
    @array_of_ids = [] 
end 
def start_element(name, attrs = []) 
    @array_of_ids << attrs[0][1].to_s if name == "job" 
end  
def end_document 
    return @array_of_ids 
end 

К сожалению, возвращаемый массив равен nil (я попробовал предоставить простую строку, тот же результат). Есть ли проблема в предоставлении возвращаемого значения? Как я могу общаться с моим парсером?

+2

Пожалуйста, разместите свой код преобразования массива ... и образец xml ... –

+0

Пожалуйста, прочтите «[mcve]». Нам нужна минимальная программа и минимальные данные, которые демонстрируют проблему в самом вопросе. Нам также нужно знать ваш ожидаемый результат. –

ответ

0

Решение: нужно структурировать вызов по-разному. Если мне нужен массив идентификаторов, то я могу получить доступ к этому через атрибут документа (нужно декодировать и кодировать json для его обработки, так как я не понимаю формат, предоставленный синтаксическим анализатором):

f = open("https://s3.eu-central-1.amazonaws.com/xml.xml") 
    id_parser = Nokogiri::XML::SAX::Parser.new(IdParser.new) 
    id_parser.parse(f) 
    @active_ids = ActiveSupport::JSON.decode(id_parser.to_json)["document"]["array_of_ids"]