Извлечение текста из тегов XML с помощью сценария sed - shell - PullRequest
1 голос
/ 27 апреля 2011

Ну, я уже написал скрипт, который в основном принимает файл XML в качестве входных данных и извлекает текст для определенных тегов XML, и он работает Но он недостаточно умен, чтобы получать многострочный текст, а также разрешать использование специальных символов. Очень важно, чтобы текстовый формат оставался неизменным, как это определено в тегах.

Ниже приведен ввод XML:

<nick>Deminem</nick>
<company>XYZ Solutions</company>
<description>
  /**
   * 
   *  «Lorem» ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy
   *  tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. 
   *  At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd 
   *  no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit 
   *  consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore
   *  magna aliquyam erat, sed diam voluptua.
   *
   **/
</description> 

Приведенный выше скрипт извлекает текст каждого конкретного тега и присваивает новый valueArray. Моя команда над sed проста, но всегда готова пройти лишнюю милю.

tagsArray=( nick company description )
noOfElements=${#tagsArray[@]}

for (( i=0;i<$noOfElements;i++)); do

OUT=`grep ${tagsArray[${i}]} filename.xml | tr -d '\t' | sed -e 's/^<.*>\([^<].*\)<.*>$/\1/' `

valueArray[${i}]=${OUT}
done 

Ответы [ 2 ]

3 голосов
/ 27 апреля 2011

Синтаксический анализ XML с помощью регулярного выражения в конечном итоге приводит к проблемам, как вы уже испытывали. Потратьте время, чтобы выучить достаточно XSL (существует множество учебных пособий ), чтобы правильно преобразовать XML, используя, например, xsltproc .

Edit:

Попробовав несколько утилит командной строки xml, я думаю, что xmlstarlet может быть инструментом для вас. Следующее является непроверенным и предполагает, что filename.xml является правильным XML-файлом (то есть имеет один корневой элемент).

tagsArray=( nick company description )
noOfElements=${#tagsArray[@]}

for (( i=0;i<$noOfElements;i++)); do
    valueArray[${i}] = `xmlstarlet sel -t -v "/root/$tagsArray[i]" filename.xml`
done
0 голосов
/ 19 апреля 2012
#!/bin/sh
filePath=$1 #XML file path
tagName=$2  #Tag name to fetch values
awk '!/<.*>/' RS="<"$tagName">|</"$tagName">" $filePath
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...