2013-04-18 4 views
0

мне нужно перечислить текст внутри этих двух элементов в многих pom.xml в дереве каталогов. Файлы могут содержать элемент в других местах тоже, я ищу только содержание этих двух.печать текста внутри <project><groupId> ..</groupId> и <project><parent><groupId> ..</groupId>

В идеале, я ищу инструмент, который выводит в формате <file-name>:<line-no>:<path>:<text>, например.

parent/pom.xml:12:/project/groupId:com.acme.project 
features/persist/pom.xml:14:/project/parent/groupId:com.acme.project 
features/persist/pom.xml:32:/project/groupId:com.acme.project.persist 

Для следующих входных файлов:

**parent/pom/xml** 
<project> 
... 
    <groupId> 
    com.acme.project <!--LINE 12 --> 
    </groupId> 
... 
</project> 

**feature/persist/pom.xml** 
<project> 
    <parent> 
    <groupId> 
    com.acme.project <!--LINE 14 --> 
    </groupId> 
    </parent> 
    ... 
    <groupId> 
    com.acme.project 
    </groupId> 
    <dependencyManagement> 
    <dependencies> 
     <dependency> 
     <groupId> 
     a.b.c.d <!-- this is not listed in output --> 
     </groupId> 
     </dependency> 
    </dependencies> 
    </dependencyManagement> 
</project> 

Обратите внимание, что другие пути, такие как dependencyManagement/dependencies/dependency/groupId не включены.

Поиск здесь на SO Я наткнулся на xmllint --xpath и , но я не знаю достаточно о xpath, чтобы понять это сам.

+0

Пожалуйста, пост Пример входных данных, которые должны давать этот выход. –

+0

Выход был составлен :) Но я составил соответствующий вход и добавил его –

+0

Только что понял, что вам нужен номер строки и путь к элементу. Нет способа получить номер строки стандартным XPath/XQuery, даже в версии 3.0. По крайней мере, [Saxon имеет некоторую проприетарную поддержку для этого] (http://saxon.sourceforge.net/saxon6.5.3/extensions.html#linenumber). К пути: в XPath/XQuery 3.0 есть 'fn: path()', поэтому вам понадобится более мощный и современный процессор. Ни [xmllint], ни [xmlstartlet] не поддерживают XPath 1.0, поэтому вам понадобится другой инструмент. –

ответ

0

Попробуйте этот совместимый с XPath 2.0 запрос без номеров строк, который проверяет все пути запроса для соответствия элементам <groupID/> и печатает их имя документа, строит (не обязательно уникальный) путь и добавляет содержимое элемента.

(//project/parent | //project)/groupId/string-join(
    (
    base-uri(), 
    string-join(('', .//ancestor-or-self::*/name()), '/'), 
    data(.) 
), ':') 

Вы можете запустить его с помощью BaseX collection, например (как я сделал для тестирования), который содержит все XML-файлы, которые вы хотите запросить.

  1. Выполнить эту команду, чтобы создать коллекцию: CREATE DB xmldocs /path/to/xml-files
  2. запрос к базе данных с использованием выше XPath

Существуют различные способы для выполнения запроса, посмотрите на Standalone Mode manual.

Запрос также должен запускаться в других совместимых с XPath 2.0 двигателях, таких как саксон (который также поддерживает номера строк, см. Мой комментарий выше).

0

Я в конечном итоге, используя Cygwin сборку из xml2:

xml2 < pom.xml | grep -e "/project/parent/groupId" -e "/project/groupId" 
/project/parent/groupId=... 
/project/groupId=.... 
Смежные вопросы