在 bash 脚本中使用 xmlstarlet 到 link xml 节点并提取元素
Use xmlstarlet in bash script to link xml nodes and extract elements
我对 XML 相当熟悉,但我从来没有深入研究过它的复杂性,而且我是 XSL、XPATH 和 XMLSTARLET 的新手。我需要一个 shell 脚本,它将从 XML 遵循这种格式的文件中提取一个简单的列表..
<tv>
<channel id="ffd49fe9acd778774b4933e10b6afb75">
<display-name>ITV</display-name>
</channel>
<channel id="398fe9bc5ee3b47556d06f9b9cb95562">
<display-name>BBC One</display-name>
</channel>
<channel id="3932fa4d11310596e0c3eba7dc8caf4c">
<display-name>Channel 4</display-name>
</channel>
<programme channel="398fe9bc5ee3b47556d06f9b9cb95562">
<title>Pointless</title>
</programme>
<programme channel="ffd49fe9acd778774b4933e10b6afb75">
<title>The Chase</title>
</programme>
<programme channel="398fe9bc5ee3b47556d06f9b9cb95562">
<title>BBC News</title>
</programme>
<programme channel="3932fa4d11310596e0c3eba7dc8caf4c">
<title>Naked Attraction</title>
</programme>
</tv>
我选择了 xmlstarlet(我使用的是 Cygwin)并且我能够轻松地生成频道列表或节目列表,但是将它们链接在一起超出了我的范围,尽管我已经做了很多谷歌搜索.
#List of channels
xmlstarlet sel -t -m /tv/channel -v display-name -n
#List of Programmes
xmlstarlet sel -t -m /tv/programme -v title -n
#Filter a particular channel
sel -t -m "tv" -v 'channel[@id="398fe9bc5ee3b47556d06f9b9cb95562"]/display-name' -n
在我看来,将最后一条语句中的方括号替换为 [@id=programme/@channel] 之类的东西似乎很简单,但 xpath 似乎不能那样工作。我正在寻找这样的结果..
Pointless, BBC One
The Chase, ITV
BBC News, BBC One
Naked Attraction, Channel 4
有人能给我指出正确的方向吗?
绕过上下文的一种方法是将匹配频道存储在变量中:
xmlstarlet sel -t -m '/tv/programme' --var ch='@channel' -v 'title' \
-v '", "' -v '/tv/channel[@id=$ch]/display-name' -n
Pointless, BBC One
The Chase, ITV
BBC News, BBC One
Naked Attraction, Channel 4
我对 XML 相当熟悉,但我从来没有深入研究过它的复杂性,而且我是 XSL、XPATH 和 XMLSTARLET 的新手。我需要一个 shell 脚本,它将从 XML 遵循这种格式的文件中提取一个简单的列表..
<tv>
<channel id="ffd49fe9acd778774b4933e10b6afb75">
<display-name>ITV</display-name>
</channel>
<channel id="398fe9bc5ee3b47556d06f9b9cb95562">
<display-name>BBC One</display-name>
</channel>
<channel id="3932fa4d11310596e0c3eba7dc8caf4c">
<display-name>Channel 4</display-name>
</channel>
<programme channel="398fe9bc5ee3b47556d06f9b9cb95562">
<title>Pointless</title>
</programme>
<programme channel="ffd49fe9acd778774b4933e10b6afb75">
<title>The Chase</title>
</programme>
<programme channel="398fe9bc5ee3b47556d06f9b9cb95562">
<title>BBC News</title>
</programme>
<programme channel="3932fa4d11310596e0c3eba7dc8caf4c">
<title>Naked Attraction</title>
</programme>
</tv>
我选择了 xmlstarlet(我使用的是 Cygwin)并且我能够轻松地生成频道列表或节目列表,但是将它们链接在一起超出了我的范围,尽管我已经做了很多谷歌搜索.
#List of channels
xmlstarlet sel -t -m /tv/channel -v display-name -n
#List of Programmes
xmlstarlet sel -t -m /tv/programme -v title -n
#Filter a particular channel
sel -t -m "tv" -v 'channel[@id="398fe9bc5ee3b47556d06f9b9cb95562"]/display-name' -n
在我看来,将最后一条语句中的方括号替换为 [@id=programme/@channel] 之类的东西似乎很简单,但 xpath 似乎不能那样工作。我正在寻找这样的结果..
Pointless, BBC One
The Chase, ITV
BBC News, BBC One
Naked Attraction, Channel 4
有人能给我指出正确的方向吗?
绕过上下文的一种方法是将匹配频道存储在变量中:
xmlstarlet sel -t -m '/tv/programme' --var ch='@channel' -v 'title' \
-v '", "' -v '/tv/channel[@id=$ch]/display-name' -n
Pointless, BBC One
The Chase, ITV
BBC News, BBC One
Naked Attraction, Channel 4