XML ファイルから単一の属性を抽出するにはどうすればよいですか?

XML ファイルから単一の属性を抽出するにはどうすればよいですか?

私は正規表現や sed などにあまり詳しくなく、今すぐに理解するのも面倒なので、この行をどのように抽出すればよいでしょうか。

<yweather:astronomy sunrise="6:50 am" sunset="7:06 pm"/>

さらに XML 構造が必要な場合はお知らせください。

答え1

入力データ (XML ファイル) は構造化されているため、プレーンテキストとして扱い、正規表現を使用するよりも、その構造化データに対してクエリを使用する方が適切です。

xmllint --xpathXML 入力に対して XPath 式を評価するために使用できます。

$ xmllint --xpath 'string(rss/channel/*[local-name()="astronomy"]/@sunrise)' weather.xml
6:48 am

- ファイル内のさまざまな名前空間を処理する必要があるため、これは少し複雑ですが、それでも機能します。

XPathの詳細については、仕様をご覧ください。http://www.w3.org/TR/xpath/

答え2

正規表現や sed は使用しません。XML パーサーと XML クエリ言語 (XPath または XQuery) を使用します。また、詳細はコンテキストによって異なります。たとえば、「yweather」は名前空間の短縮名 (プレフィックス) であり、それがどの名前空間を表すかを知る必要があります。

答え3

Michael Kay 氏が言うように、正しい答えは XML 専用のツールを使用することです。

手っ取り早い解決策として、sed アプローチがあります。まずはこのファイルから始めましょう:

$ cat file
<yweather:astronomy sunrise="6:50 am" sunset="7:06 pm"/>

日没時刻を抽出するには:

$ sed -rn 's/.*sunset="([^"]*)".*/\1/p' file
7:06 pm

正規表現を理解するために、3 つの部分に分解してみましょう。

  1. .*行の先頭から2番目の部分まで一致します

  2. この部分 は、sunset="([^"]*)"文字 にsunset="、 を除く任意の数の文字が続き"、その後に閉じ が続くものに一致します"。式 は[^"]を除く任意の文字を意味し"、は[^"]*そのような文字の任意の数を意味します。括弧 は、(...)内の文字を"..."sed のグループ 1 にキャプチャします。これは後で として参照されます\1

  3. .* sunset 表現の後のすべての文字と一致します。

答え4

私も同じ答えをしますジェレミー・カーしかし、xml例を挙げて説明します。

ルート フォルダーにxml ファイルがありconfig.xml、タグの属性またはプロパティ (タグとする) を読み取りたいとしますwidget

config.xml:

<?xml version='1.0' encoding='utf-8'?>
<widget android-versionCode="16" id="co.app.world" ios-CFBundleVersion="0.1.3" version="3.0.5" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
    <name>AppName</name>
    <description>Description.</description>
    <author email="hi@ionicframework" href="http://ionicframework.com/">Ionic Framework Team</author>
</widget>

プロパティ値を取得するにはandroid-versionCode、ターミナルに次のように入力します。

xmllint --xpath "string(//*[local-name()='widget']/@android-versionCode)" config.xml

出力:

16

説明:タグ/*[local-name()='widget']をマップしwidget@android-versionCodeそのプロパティを読み取るために使用します。

関連情報