0

私は Perl と XML::LibXML を使用しており、扱う必要がある XML は次のようになります。

<PARAM NAME = "A"><VALUE>1</VALUE>
<PARAM NAME = "B"><VALUE>3</VALUE>
<PARAM NAME = "C"><VALUE>43</VALUE>
<PARAM NAME = "A"><VALUE>6</VALUE>
<PARAM NAME = "B"><VALUE>3</VALUE>
<PARAM NAME = "C"><VALUE>13</VALUE>
.
.
.

私が必要とする出力は基本的に次のとおりです。

A    B    C
1    3    43
6    3    13

次のように、リテラル ノード名を配列に入れました。

my @attributes = (
    './PARAM[@NAME = "A"]/VALUE',
    './PARAM[@NAME = "B"]/VALUE',
    .
    .
);

そして、これらの xpath リテラルを foreach ループの引数として findnodes() および findvalue() を使用して、誤って値の「セット」を取得してレコードに書き込もうとしました。当然のことながら、findnodes() は、ループを通過するたびに基準を満たすすべてのノードを取得するため (本来はそうする必要があります)、正しくありません。 -名前付きノード値。

このファイルはそのままの構造になっているため、「A ~ C」ノード/値をキャプチャし、レコードを書き込んでから繰り返す方法はありません。少なくとも、すべてのノードをチェックして「最後のone' ('C')。基本的に、これをプレーンな古いテキスト ファイルとして処理する必要があるようです。

4

3 に答える 3

0

使用している言語を提供していませんが、perl のようです。基本的に、すべての<VALUE/>要素 (それぞれのテキスト ノード) を取得してから、それらをループし、毎回 3 つの値を読み取ります。

ややパーリッシュな種類の疑似コードで:

@attributes = xpath('//PARAM/VALUE');
for ($i = 0; i < length(@attributes); i += 3)
  push @records (@attributes[$i], @attributes[$i + 1], @attributes[$i + 2])

結果として、配列の配列を取得する必要があります (もちろん、ハッシュの配列を返すこともできます)。printf出力だけが必要な場合は、 の代わりに を適切に呼び出して上記のパターンを使用しますpush

于 2014-04-22T21:21:19.613 に答える