2013-11-27 4 views
0

Я пытаюсь изменить indl-файл. Indl-файл - это файл, созданный Adobe Indesign для хранения структуры документа и в основном XML. Я хочу использовать Nokogiri, чтобы найти некоторые выбранные узлы XML и заменить текст на свой текст, сохранив xml в другой файл.Nokogiri, найти узел XML с несколькими атрибутами и изменить текст

XML, конечно, странно: я найти какой-нибудь документ, чтобы получить HTML-тег с Nokogiri изменения текста, но я не знаю, как я могу управлять кусок XML, как это:

<cflo> 
<txsr prst="o_u5084" crst="o_u5085" trak="D_10"> 
    <pcnt>c_tEST</pcnt> 
</txsr> 
<txsr prst="o_u5086" crst="o_u5c" trak="D_20"> 
<pcnt>c_Titolo titolo titolo</pcnt> 
</txsr> 
<cflo> 

В основном нужно искать комбинацию атрибутов prst и crst и заменять содержимое внутри узла pcnt.

Стараюсь с этим

@doc.xpath("//txsr[prst='o_u5086' and crst='o_u5085']") 

, но я не знаю, как я могу изменить þér текст внутри pcnt узла.

+0

http://amolnpujari.wordpress.com/2012/03/31/reading_huge_xml-rb/ Я также нашел быка в 5 раз быстрее, чем nokogiri время чтение большого xml. Плюс У меня есть написанная оболочка, которая просто позволяет вам искать большой xml с помощью ox, позволяет вам итерации с указанным элементом. https://gist.github.com/amolpujari/5966431 –

+0

Ваш XML недопустим, так как нет закрывающего тега. Это в самом XML? Это может путать синтаксические анализаторы, заставляя их возвращать неверные результаты. –

ответ

0
  1. Это неправильный XPath. Правильный XPath будет выглядеть следующим образом:

    @doc.xpath("//txsr[@prst='o_u5086'][@crst='o_u5085']") 
    
  2. Вы должны просто взять первый узел из набора и использовать метод inner_html= заменить текстовое значение.

Полный код можно найти здесь: https://gist.github.com/kaineer/7673698

+0

MMh ... селектор работает. Теперь я извлекаю содержимое элемента, но я не могу его изменить. Undefined method inner_html :( –

+0

Кажется, вы потеряли часть своего вывода. Когда я изменил xpath на ваш, у меня есть «неопределенный метод' inner_html = 'для nil: NilClass ». И это Очевидно, вы не получаете узлы из XML DOM из-за неправильного xpath, и вы не можете изменять содержимое узлов, которые вы не получили. Позвольте мне рассказать вам, почему ваш xpath был неправильным. Он не проверяет значения атрибутов, потому что вы нужно использовать знак @ для этого. Использование «и» вместо множимых скобок оказалось правильным, хотя :) Итак, @ doc.xpath («// txsr [@ prst = 'o_u5086» и @ crst =' o_u5085 ' ] ") тоже будет работать. – kaineer

+0

Опять же, если вы не добавите '/ pcnt' в хвост xpath, вам понадобится больше кода, чтобы перейти к узлу pcnt. – kaineer

Смежные вопросы