2

一部の言語のテキストを含む XML ファイルがあります。テキストを 1 つの言語だけで抽出し、別のファイルに保存したいと考えています。これどうやってするの?私のファイルの最初の行の一部を次に示します。

<?xml version="1.0" encoding="UTF-8"?>
<tmx version="1.4b">
  <header creationtool="ORESAligner" creationtoolversion="1.0" datatype="plaintext" segtype="paragraph" adminlang="en-us" srclang="EN" o-tmf="ORES"/>
  <body>
    <tu tuid="55_100:6">
      <prop type="session">55</prop>
      <prop type="committee">3</prop>
      <tuv xml:lang="EN">
        <seg>RESOLUTION 55/100</seg>
      </tuv>
      <tuv xml:lang="AR">
        <seg>القرار 55/100</seg>
      </tuv>
      <tuv xml:lang="ZH">
        <seg>第55/100号决议&lt;/seg>
      </tuv>
      <tuv xml:lang="FR">
        <seg>RÉSOLUTION 55/100</seg>
      </tuv>
      <tuv xml:lang="RU">
        <seg>РЕЗОЛЮЦИЯ 55/100</seg>
      </tuv>
      <tuv xml:lang="ES">
        <seg>RESOLUCIÓN 55/100</seg>
      </tuv>
    </tu>
  </body>
</tmx>

ここで、英語のテキストだけが必要だとします。目的の出力は次のようになります。

RESOLUTION 55/100

このスクリプトはどのように使用すればよいですか? 私は XML ファイルを操作する初心者であり、この XPath 式をどのように使用すればよいかわかりません。私が知っているように、xmlstarlet は XML ファイルを変更できます。でも方法がわからない…?

4

4 に答える 4

3

XmlStarletを使用して英語ノードを抽出する

xmlstarletを使用してXPathを使用してXMLをクエリし、英語の属性を持つノードのみを返すことができます。例えば:

$ xmlstarlet sel -t -v "//tuv[@xml:lang='EN']/seg/text()" /tmp/foo
RESOLUTION 55/100

言語拡張機能を備えたファイルにノード値を保存する

これらの値を言語ベースのファイルに保存する場合は、見つかった各ノードの値を言語ベースの拡張子(英語の場合は「EN」など)のファイルにダンプできます。

# Don't overwrite LANG; use some other variable.
language='EN'

xmlstarlet sel \
    --noblanks \
    --text \
    --template \
    --match "//tuv[@xml:lang='${language}']" \
    --value-of seg \
    -n \
    /tmp/foo > "/tmp/foo.$language"

この例では、一致するすべてのノードの内容が/tmp/foo.ENに書き込まれ、さらに処理されます。追加の要件に合わせて、シェルのリダイレクトを確実に調整できます。

于 2012-07-23T00:35:26.033 に答える
1

xmlファイルが適切にフォーマットされている場合は、簡単なsedコマンドを使用できます。

sed -n '/xml:lang="EN"/ {
N
s_.*<seg>\([^<]*\)</seg>_\1_p
}
' input_file

説明:

sed -n '/xml:lang="EN"/ {           # 1) exec sed with no print flag, find a line
                                    # matching xml:lang="EN"
N                                   # 2) read the next line
s_.*<seg>\([^<]*\)</seg>_\1_p       # 3) replace everything until </seg> with 
                                    # the text between <seg> and </seg> and print
}
' input_file

segタグを保持したい場合は、3番目のステップを変更できます。

sed -n '/xml:lang="EN"/ {
N
s_.*\(<seg>[^<]*</seg>\)_\1_p
}
' input_file
于 2012-07-22T11:16:56.090 に答える
1

次の XPath 式は、探している情報を抽出します。

/tmx/body/tu/tuv[@xml:lang='EN']/seg

XPath 式を使用して XML ファイルを処理できるツールは多数あります。コマンドラインから作業している場合は、xmlsh.

要件のコンテキストを説明するのは難しいですが、ここで示した単純なケースを超えて拡張するにつれて、XSLT や XQuery を確認したくなると思います。

于 2012-07-22T11:49:23.640 に答える