2014-10-27 4 views
0

У меня есть довольно простой документ ODF, который я хочу разобрать с помощью nokogiri.Альтернативный синтаксис для XPath в nokogiri, разбор ODF

XML-выглядит следующим образом:

<office:body> 
<office:text> 
    <text:sequence-decls> 
     ... 
    </text:sequence-decls> 
    <text:section text:name="categorylevel1" text:style-name="Sect1"> 
     <text:p text:style-name="Title">[CATEGORY_LEVEL_1_NAME]</text:p> 
    </text:section> 
</office:text> 

В настоящее время я пытаюсь выбрать categorylevel1 раздел документа. Библиотека, которую я использую, автоматически генерирует XPath и дает
".//text:section[@text:name='categorylevel1']"
, что является правильным. Теперь проблема в том, что библиотека (nokogiri), кажется, принимает этот путь под MRI, но не под JRuby (бросает SyntaxError). По-видимому, Java-версия библиотеки не поддерживает атрибуты пространства имен.

Есть ли альтернативный способ ссылки на раздел документа? Например, просто используя атрибут text:name? Есть ли способ игнорировать пространство имен? Значение атрибута раздела text:name будет уникальным для всего документа, поэтому пропуская ссылку не будет проблемой.

ответ

2

«Есть ли альтернативный способ ссылки на раздел документа? Например, просто используя атрибут text: name?»

Вы можете игнорировать имя элемента с помощью *, таким образом, вы можете ссылаться на элемент используя только текст: имя атрибута:

.//*[@text:name='categorylevel1'] 

«Есть ли способ игнорировать Пространство имен?»

Вы можете использовать local-name(), чтобы игнорировать пространства имен. Например, чтобы фильтровать элемент на значение атрибута text:name, игнорируя пространство имен атрибута:

.//*[@*[local-name()='name' and .='categorylevel1']] 
+0

Благодарим вас за примеры. Второй путь сделал эту работу! Однако первый также создает синтаксический код. Поддержка пространств имен в Java должна быть действительно ограниченной. – Toshe