xmllintを使用してXMLを解析し、出力をカスタマイズする

xmllintを使用してXMLを解析し、出力をカスタマイズする

次のスキーマを含むxmlファイル(input.xmlなど)があります。

<?xml version="1.0"?>
  <TagA>
    <TagB>
      <File Folder="FOLDER1M\1" File="R1.txt" />
    </TagB>
    <TagB>
      <File Folder="FOLDER1M\2" File="R2.txt" />
    </TagB>
    <TagB>
      <File Folder="FOLDER2M\1" File="R3.txt" />
    </TagB>
  </TagA>

このファイルを解析し、出力を別のファイルに書き込む必要があります。必要な出力は次の形式でなければなりません。

www.xyz.com\FOLDER1M\1\R1.txt
www.xyz.com\FOLDER1M\2\R2.txt
www.xyz.com\FOLDER2M\1\R3.txt

私がこれまでに得たものは次のとおりです。

echo 'cat /TagA/TagB/File/@*[name()="Folder" or name()="File"]' | xmllint --shell input.xml | grep '=' > xml_parsed

これは私に次の形式のo / pを提供します。

/ > cat /TagA/TagB/File/@*[name()="Folder" or name()="File"]
Folder="FOLDER1M\1"
File="R1.txt"
Folder="FOLDER1M\2"
File="R2.txt"
Folder="FOLDER2M\3"
File="R3.txt"

現在の出力の代わりに希望の出力を取得するにはどうすればよいですか?

答え1

これは一つの方法です。簡単にテストできるように、出力をexample.txtというファイルに入れました。 echoコマンドの最後に私のコマンドを追加するだけです。

サンプル.txt

Folder="FOLDER1M\1"
File="R1.txt"
Folder="FOLDER1M\2"
File="R2.txt"
Folder="FOLDER2M\3"
File="R3.txt"

注文する

% cat sample.txt | sed 'h;s/.*//;G;N;s/\n//g' | sed 's/Folder=\|"//g' | sed 's/File=/\\/' | sed 's/^/www.xyz.com\\/'

コマンド分解

2行ずつすべてを合わせる

# sed 'h;s/.*//;G;N;s/\n//g'
Folder="FOLDER1M\1"File="R1.txt"
Folder="FOLDER1M\2"File="R2.txt"
Folder="FOLDER2M\3"File="R3.txt"

フォルダを削除=&"

# sed 's/Folder=\|"//g'
FOLDER1M\1File=R1.txt
FOLDER1M\2File=R2.txt
FOLDER2M\3File=R3.txt

File=を '\'に置き換えます。

# sed 's/File=/\\/'
FOLDER1M\1\R1.txt
FOLDER1M\2\R2.txt
FOLDER2M\3\R3.txt

www.xyz.comを挿入してください。

# sed 's/^/www.xyz.com\\/'
www.xyz.com\FOLDER1M\1\R1.txt
www.xyz.com\FOLDER1M\2\R2.txt
www.xyz.com\FOLDER2M\3\R3.txt

編集#1

OPは、出力の最初の行を削除するために私の答えを修正する方法を尋ねる質問を更新しました。たとえば、次のようになります。

/ > cat /TagA/TagB/File/@*[name()="Folder" or name()="File"]
...
...

私はこれを使って、grep -v ...次のような無関係な行をフィルタリングできると彼に言いました。

% cat sample.txt | grep -v "/ >" | sed 'h;s/.*//;G;N;s/\n//g' | sed 's/Folder=\|"//g' | sed 's/File=/\\/' | sed 's/^/www.xyz.com\\/'

または、ビット全体をファイルに書き込むには、次のようにします。

% cat sample.txt | grep -v "/ >" | sed 'h;s/.*//;G;N;s/\n//g' | sed 's/Folder=\|"//g' | sed 's/File=/\\/' | sed 's/^/www.xyz.com\\/' > /path/to/some/file.txt

答え2

xmllintこれに使用するのは難しいでしょう。

使用xmlstarlet:

xmlstarlet sel -t \
    -m '//TagB/File' \
    -v 'concat("www.xyz.com", "\", @Folder, "\", @File)' \
    -nl file.xml

またはコマンドラインにウェブサイトのアドレスを安全に提供するには、

thesite=www.xyz.com
xmlstarlet sel -t --var site="'$thesite'" \
    -m '//TagB/File' \
    -v 'concat($site, "\", @Folder, "\", @File)' \
    -nl file.xml

TagB/Fileまず、ドキュメント内のすべてのノードセットを選択し、各ノードの文字列をwww.xyz.com属性値Folderと属性値File\間に区切り文字を含む)に関連付けます。これにより、-nl関連付けられた値の後に改行文字が表示されます。

問題のXML文書の出力を提供します。

www.xyz.com\FOLDER1M\1\R1.txt
www.xyz.com\FOLDER1M\2\R2.txt
www.xyz.com\FOLDER2M\1\R3.txt

関連情報