从 XML 的多个相似标签中获取特定标签

Get Specific Tags from Multiple Similar Tags of XML

我有一个 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' using Shell Script .

我尝试使用:

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

但此命令返回 xml 标签的每个字段。

Operating System
3
Theory
Prof. XYZ
Web Development
3
Lab

寻找在存在多个标签时仅获取特定标签值的解决方案。

TIA。

能否请您尝试以下,我不是专家xamlstarlet在这里尝试一下。

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

简要说明: 使用 xmlstarlet 处理 xml 文件然后输出格式我使用 awk(在 xml 处理后)从输出中删除不必要的空格和换行。



编辑: 因为 OP 告诉他不能在系统中安装 xmlstarlet 所以添加 awk 解决方案但公平警告 awk 不是 xml 的工具,仅通过查看显示的示例添加了以下解决方案。

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