XPathでぶっこ抜きました。
xmlstarlet
インストール
$ brew install xmlstarlet
MyJVN API のレスポンスからCVE識別子をぶっこ抜く
$ jvn_id="JVNDB-2016-002463" # http://jvndb.jvn.jp/myjvn?method=getVulnDetailInfo&vulnId=JVNDB-2016-002463 $ curl http://jvndb.jvn.jp/myjvn -d method=getVulnDetailInfo -d vulnId=`echo $jvn_id` > vul.xml $ cat vul.vml > <VULDEF-Document xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://jvn.jp/vuldef/" xmlns:vuldef="http://jvn.jp/vuldef/" xmlns:status="http://jvndb.jvn.jp/myjvn/Status" version="3.1" xsi:schemaLocation="http://jvn.jp/vuldef/ http://jvndb.jvn.jp/schema/vuldef_3.1.xsd http://jvndb.jvn.jp/myjvn/Status http://jvndb.jvn.jp/schema/status_3.2.xsd" xml:lang="ja"> > <Vulinfo> > <VulinfoID>JVNDB-2016-002463</VulinfoID> > <VulinfoData> > <Title>GD Graphics Library における整数符号エラーの脆弱性</Title> > <VulinfoDescription> > <Overview> > ... > <RelatedItem type="advisory"> > <Name>Common Vulnerabilities and Exposures (CVE)</Name> > <VulinfoID>CVE-2016-3074</VulinfoID> > <URL> > http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-3074 > </URL> > </RelatedItem> > <RelatedItem type="advisory"> > <Name>National Vulnerability Database (NVD)</Name> > <VulinfoID>CVE-2016-3074</VulinfoID> > <URL> > http://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2016-3074 > </URL> > </RelatedItem> > ... $ xmlstarlet sel -t -n -m "//_:RelatedItem[@type='advisory' and (.//_:Name[contains(text(),'CVE')] or .//_:Name[contains(text(),'NVD')])][1]/_:VulinfoID/text()" -c . vul.xml > CVE-2016-3074
xmlstarlet
の場合、デフォルト名前空間(上記のXMLではxmlns="http://jvn.jp/vuldef/"
) が_
にバインドされているので、
要素名の前に_:
を付与してあげればよいのです(むしろ付与しないとまともに動作しない)。