web-dev-qa-db-ja.com

選択した値をXMLで抽出する方法

同様のコンテンツXMLファイルから値のみを抽出したいと思います。

例;

<?xml version="1.0" encoding="UTF-8" ?>
<items>   

<channel>
<title><![CDATA[*** text 1 text ***]]></title>
<playlist_url><![CDATA[http://Host.net/aa/15_info/]]></playlist_url>
</channel>

<channel>       
<title><![CDATA[*** text 2 text ***]]></title>
<playlist_url><![CDATA[http://Host.net/aa/16_info/]]></playlist_url>
</channel>

<channel>      
<title><![CDATA[*** text 3 text ***]]></title>
<playlist_url><![CDATA[http://Host.net/aa/vodpr/]]></playlist_url>  
<protected>True</protected> 
</channel>

<channel>
<title><![CDATA[*** text 4 text ***]]></title>
<playlist_url><![CDATA[http://Host.net/aa/vodpr/con_tv_r.php]]></playlist_url>
<protected>True</protected> 
</channel>

</items>

別々に抽出する必要があります ' http://Host.net/aa/vodpr/ 'と ' http://Host.net/aa/vodpr/con_tv_t.php '可変URL値。

宜しくお願いします

2

channelprotectedノードを持つ各Trueノードのplaylist_urlノードの値を取得するとします。

$ xmlstarlet sel -t -v '//channel[protected = "True"]/playlist_url' -nl file.xml
http://Host.net/aa/vodpr/
http://Host.net/aa/vodpr/con_tv_r.php

これは、xmlstarletを使用してXPATHクエリをドキュメントに適用します。最後の-nlは、最後のデータに終了改行を追加します。


titleノードの特定のテキストに対応するURL(たとえば、「contains text 3」)を選択するには、次を使用します。

$ xmlstarlet sel -t -v '//channel[./title[contains(., "text 3")]]/playlist_url' -nl file.xml
http://Host.net/aa/vodpr/

ここでは、titleノードの値でtext 3テキストを検出し、その特定のchannelノードを選択します。次に、そこからplaylist_urlを選択します。

2
Kusalananda