Использование xmlSimple.xmlIn (файл) с Ruby - PullRequest
0 голосов
/ 03 июля 2011

У меня проблемы с получением правильной работы xmlSimple в моем файле .rb.Я использую xmlSimple.xmlIn(filename);, но, похоже, произошла ошибка при поиске правильного файла.Я переместил файл в корзину, и файл существует, что означает filename.exists? = true.Есть идеи по поводу возможного источника ошибок?Спасибо!

-Edit- Позвольте мне добавить эту информацию;Я очень плохо знаком с Ruby, и есть большая вероятность, что мой метод или синтаксис совершенно неверен, вот мой код в файле .rb:

require 'xmlsimple'

file_name = 'xmldatatest.xml'

paragraph_str = 0

file = File.open(file_name) # takes XML Data and creates a file of the data

File.open(file_name, "w+") do |f|     # open file for update

lines = f.readlines           # read into array of lines

lines.each do 

    |it|           
                  # modify lines
        it.gsub!(/\n/, '')
    it.gsub!('<p>', '')
    it.gsub!('</p>', '')
    it.gsub!('\"Paragraph.\"', 'Paragraph')
    if ((it.include? ('Paragraph')) == 1)
    paragraph_str += 1
    end

   while paragraph_str > 0 do

    initial_value = paragraph_str

    if ((paragraph_str == initial_value))
    it.gsub!(/Paragraph/, '<p>')
    paragraph_str -= 1
    else 
    it.gsub!(/Paragraph/, '</p><p>')
    paragraph_str -= 1
    end

    end    
    f.print lines                 # write out modified lines
    end
end

File.open(file_name, 'a') {|f| f.puts "</p>" }

ref  = XmlSimple.xml_in(file_name)

Цель программы - убрать все escape-символыиз исходного файла XML, а затем замените каждый узел "Paragraph #" в тегах <p> и </p>.После чего файл будет проанализирован с использованием XmlSimple.Xml_in(filename).Любые предложения или исправления приветствуются.

Ответы [ 2 ]

0 голосов
/ 04 июля 2011

Некоторые вещи, которые я заметил:

file = File.open(file_name) # takes XML Data and creates a file of the data

File.open(file_name, "w+") do |f|     # open file for update

lines = f.readlines           # read into array of lines

Обратите внимание, что вы пытаетесь прочитать из файла дескриптор f, который фактически открыт для записи. f.readlines должно быть file.readlines.

Более рубиновый способ работы с ним:

lines = []
File.open(file_name) do |f|
  lines = f.readlines
end

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

it.gsub!(/\n/, '') можно записать как it.chomp!.

if ((it.include? ('Paragraph')) == 1) может быть if (it['Paragraph']).

0 голосов
/ 04 июля 2011

Насколько я понимаю, в ruby ​​xml работает очень медленно, если не связан с библиотекой C.И что nokogiri является лучшим из поддерживаемых лотов.

В дополнение к этому, ваш вопрос:

однако, похоже, что при поиске возникла ошибкаправильный файл

Если вы используете потоки и проверяете, существует ли файл, он может вернуть true | false в операторе if, но к моменту его прочтения может произойти обратное.

Добавление к этому обычного yada yada о разборе html с использованием regex apply /

...