Получить Specifi c Теги из нескольких похожих тегов XML - PullRequest
0 голосов
/ 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>

Я хочу получить результат только тех классов, которые относятся к 'type' = 'Theory' , используя Shell Script .

Я пытался использовать:

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

Но эта команда возвращает каждое поле тегов xml.

т.е.

Operating System
3
Theory
Prof. XYZ
Web Development
3
Lab

Ищите решение, чтобы получить только указанные c значения тега, если присутствует несколько тегов.

TIA.

1 Ответ

1 голос
/ 10 апреля 2020

Не могли бы вы попробовать следующее, я не эксперт xamlstarlet, чтобы попробовать здесь.

xmlstarlet sel -t -v  "classes" Input_file |
awk '
NF{
  gsub(/^[[:space:]]+|[[:space:]]+$/,"")
  print
}'

Краткое объяснение: Обработка xml файл с xmlstarlet, затем для форматирования вывода я использую awk (после обработки xml), который удаляет ненужные пробелы и новые строки из вывода.



РЕДАКТИРОВАТЬ: Так как ОП сказал, что он не может установить xmlstarlet в систему, поэтому добавление awk решения, но справедливое предупреждение awk НЕ является инструментом для xml, добавлено следующее решение, увидев показанные образцы только.

awk -F"[><]" '
/<\/subject>/{
  if(found){
    print val
  }
  found=val=""
  next
}
/<subject>/{
  found=1
  next
}
found{
  val=(val?val ORS:"")$3
}
'   Input_file
...