Сохранение тегов XML файла в массиве с использованием сценария оболочки - PullRequest
1 голос
/ 10 апреля 2020

У меня есть XML файл в формате:

<classes>

 <subject>
  <name>Operating System</name>
  <credit>3</credit>
  <type>Theory</type>
  <faculty>Prof. XYZ</faculty> 
 </subject>

 <subject>
  <name>Web Development</name>
  <credit>3</credit>
  <type>Lab</type>
 </subject>

</classes>

Я хочу сохранить имена тегов, например, имя, кредит, тип, факультет, в массиве, используя Shell Script.

Я пытался использовать команду awk как:

awk -F'[<>]' '/<name>|<credit>|<type>|<faculty>/{print $2}' file.xml

Но он возвращает значения как:

name
credit
type
faculty
name
credit
type

Как сохранить эти результаты в массиве?

Ответы [ 2 ]

2 голосов
/ 11 апреля 2020

Если вы контролируете источник xml, я понимаю соблазн сократить его вручную. Но есть много вещей, которые могут go ошибаться при таком подходе. Для анализа xml.

безопаснее использовать библиотеку xml. Вот способ использования lib xml с интерфейсом командной строки, xsltpro c:

xsltproc classes.xsl classes.xml

классы .xsl:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text" />
    <xsl:strip-space elements="*" />

    <xsl:template match="/classes/subject/*">
        <xsl:text>&#x09;</xsl:text>
        <xsl:value-of select="name(.)" /><xsl:text>:&#x09;</xsl:text>
        <xsl:value-of select="." /><xsl:text>&#x0a;</xsl:text>
    </xsl:template>

    <xsl:template match="/classes/subject/name">
        <xsl:text>'</xsl:text>
        <xsl:value-of select="." />
        <xsl:text>':&#x0a;</xsl:text>
    </xsl:template>
</xsl:stylesheet>

ввод:

<?xml version="1.0"?>
<classes><subject><name>Operating System</name><credit>3</credit><type>Theory</type><faculty>Prof. XYZ</faculty></subject><subject><name>Web Development</name><credit>3</credit><type>Lab</type></subject></classes>

вывод:

'Operating System':
    credit: 3
    type:   Theory
    faculty:    Prof. XYZ
'Web Development':
    credit: 3
    type:   Lab

Когда я нарезал и нарезал кубиками xml, кто-то нашел время, чтобы объяснить это для меня. Теперь я плачу вперед.

0 голосов
/ 10 апреля 2020
result=($(awk -F'[<>]' '/<name>|<credit>|<type>|<faculty>/{print $2}' file.xml))
resultlen=${#result[@]}
echo "resultlen size: ${resultlen}"

for i in "${!result[@]}";
do 
    echo "Tags ${i} : ${result[i]}"
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...