XML:搜索特定值并重写其他值

时间:2016-05-08 10:42:28

标签: xml bash shell

我需要一些shellcript,它在嵌套标签的serverlist.xml中搜索。该脚本必须搜索ping标记。如果ping值大于0,则标记" numplayers"的值必须多一个。如果ping标记为0,那么它不应该提高标记" numplayers的值。

例如在这个xml文件中:服务器1有一个名字标记为" hansfrans"应该计算numplayers标记,因为它有一个ping值" 30",但是名字标记为#34; E.Krenz ^ GDR"不应该计算,因为它有一个ping值" 0"。

e.g。服务器2有2个ping 0的播放器,因此numplayers值必须为0。

serverlist.xml具有随机数量的服务器,因此它必须为每个服务器本身计算numplayers值。

serverlist.xml

<qstat>
<server>
<hostname>1.2.3.4:27965</hostname>
<name>Server 1</name>
<gametype>type1</gametype>
<map>q3dm13</map>
<numplayers>2</numplayers>
<maxplayers>14</maxplayers>
<numspectators>0</numspectators>
<maxspectators>0</maxspectators>
<retries>0</retries>
  <players>
<player>
<name>hansfrans</name>
<score>27</score>
<ping>30</ping>
</player>
<player>
<name>E.Krenz^GDR</name>
<score>16</score>
<ping>0</ping>
</player>
  </players>
</server>

<server>
<hostname>2.3.4.5:27964</hostname>
<name>Server 2</name>
<gametype>type 1</gametype>
<map>q3dm1</map>
<numplayers>2</numplayers>
<maxplayers>16</maxplayers>
<numspectators>0</numspectators>
<maxspectators>0</maxspectators>
<retries>0</retries>
  <players>
<player>
<name>G.Schroeder^GER</name>
<score>17</score>
<ping>0</ping>
</player>
<player>
<name>H.Kohl^GER</name>
<score>45</score>
<ping>0</ping>
</player>
  </players>
</server>
</qstat>

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

根据架构定义验证文档,您可以使用xmllint。它至少支持DTD, RELAX NG and XML Schema formats

修改文档,您可以使用xsltproc

xsltproc --output output.xml transform.xslt serverlist.xml

从文档中提取节点,您还可以使用xmllint

$ xmllint --xpath "//name" serverlist.xml
<name>Server 1</name><name>hansfrans</name><name>E.Krenz^GDR</name><name>Server 2</name><name>G.Schroeder^GER</name><name>H.Kohl^GER</name>