1

特定の名前 (つまり、いくつかの正規表現に一致するいくつかの名前) を見つけて、それぞれに対応する値を、それらが xml に現れた場所で非表示にする必要があり ます XML 解析ライブラリ (Twig? libXML? other?)を
使用して解析しますが、編集する必要があるノードを選択するためです (つまり、XML 対応ライブラリを使用して解析する必要がありますが、名前が特定の複雑な正規表現に一致するノードの値を置き換えるだけです)。

コードの試行を提供しなかったことを深くお詫びします:(いくつかの回答を適応させようとしましたが(例: https://stackoverflow.com/a/11482566/1841533、および他のかなりの数も)、私は新人ですPerl は、1) ファイル内の任意の深さでブラウズし、2) 正規表現に一致する名前を探します。私の貧弱な試みを投稿することは、議論の方向性を「狭める」だけです (つまり、私は本当にXYProblemを避けたいです: 既存の試みを示し、それらが修正された場合、以下の要件は、私の試みが不足しているため一致しません。)任意の深さで」または「正規表現に一致する名前」を完全に ...)

**サンプルコードが必要な場合 (完全に理解できます...)、これ以上読まないでください。** (または、私が何も提供しない理由を確認するために少しだけ)
ただし、以下の 3 つの XML の例と、それらに対して何をする必要があるかを示す次の 4 つのドットを読むことができる場合 (または、より良いのは、その後のすべて) 「What I need:」行)、「テンプレート」スクリプト (つまり、可能であれば twig または libXML を使用したいくつかの perl) を提供してください。
[私は、さまざまな SE サイトで多くの人に支援を提供するために多くの時間を費やしています...そして、サンプル コードを投稿してほしいと思うことがよくあります。ですから、多くの人がこれに反対票を投じたり、答えなかったり、不満を感じたりする理由を理解しています. しかし、ここで 1 つのサンプル コードを作成するには、必要なものを「ゆがめ」て XY 問題を作成する必要があります。私が試したものの代わりに...]

必要なもの

さまざまな構造の xml ファイルが多数あります。

以下では、「someNames」はいくつかの異なる文字列である可能性があり、その中で(複雑な)正規表現に一致するものだけを見つける必要があります。
そして、1 つ (または複数の一致) を見つけたら、"someValue" が関連付けられた値になり、これを一般的な文字列に置き換えます。

XML は非常に単純ですが、いくつかの異なる構造があります。

たとえば、XML に次のものが含まれる場合があります。

...
   <sometag  name=someName  value=someValue>  
...

(someName または someValue は引用符で囲まれているかどうかに関係なく)

また

...
   <someName>someValue</someName>  
...

または別の形式:

... 
   <someothertag   someName=someValue>
...
  • someValue は、xml に応じて、「=」の後にある場合、引用符を使用する場合と使用しない場合があります。
  • someName は、次のように記述されている場合、引用符で囲まれていてもいなくてもかまいません。name=someName
  • someName は各ファイルで変更されますが、特定の複雑な正規表現に一致するものを見つけたいです (例: /\(abc\)|\([^xyz]*def\)|..../、つまり、正規表現は非常に複雑になる可能性があります)。

  • 正規表現に一致する「someName」について、それらが一致する場合にのみ、対応する「someValue」を「hidden」などの一般的な文字列で変更したいと考えています。(someValue自体は各ファイルで変更できます。しかし、それが何であれ(つまり、「.*」に一致する可能性があります)、新しい値「hidden」に置き換えたいです)

タグの深さもファイルごとに異なる可能性があります(そのため、一般的な解析が必要です)

申し訳ありませんが、ここで見つけたすべての例は特定のタグまたは特定の構造のものであり、それらから使用方法twigまたはlibXMLより一般的なアプローチを行う方法を把握できなかったため、その方法を見つけることができません... (私はPerlに非常に慣れていません!)

正規表現を配置する方法、さらにはいくつかの XML を解析し、各 xml 内の任意のレベルで名前を探す方法を見つけるのに苦労しています

これを行う方法についてのヒントは大歓迎です!

更新:私は合理的な最初の試みを考え出すために懸命に努力しています...しかし、私がそれを思い付くまでに、その質問を削除できると思います. 今、私はhttps://stackoverflow.com/a/11482566/1841533をGrokしようとしています:しかし、それは私が必要とするものではありません. その例を1に変更する必要があります(その回答のようにXMLを直接提供するのではなく)任意のファイルを開くことができます2)「findnodes」を使用して、名前(対応するではなくtagName)のタグを見つける必要があります正規表現に一致します(固定の「文字列」ではありません)3)そして、それらのタグ名を見つけたら、対応する値を編集して「非表示」に変更する必要があります。

4

1 に答える 1

2

XML::LibXML::XPathContext のドキュメントには、名前が特定の正規表現に一致するすべてのノードを見つけるための例があります。

my $perlmatch = sub {
    die "Not a nodelist"
        unless $_[0]->isa('XML::LibXML::NodeList');
    die "Missing a regular expression"
        unless defined $_[1];

    my $nodelist = XML::LibXML::NodeList->new;
    my $i = 0;
    while(my $node = $_[0]->get_node($i)) {
        $nodelist->push($node) if $node->nodeName =~ $_[1];
        $i ++;
    }

    return $nodelist;
};

my $xc = XML::LibXML::XPathContext->new($node);
$xc->registerFunction('perlmatch', $perlmatch);
my @nodes = $xc->findnodes('perlmatch(//*, "foo|bar")');

この関数を使用すると、次のperlmatchようなノードを見つけることができます。

<someName>someValue</someName>

関数の重要な行は次のとおりです。

$nodelist->push($node) if $node->nodeName =~ $_[1];

これはXML::LibXML::Nodeを取り、指定された正規表現をノードの名前に対して評価します。変更を加えると、属性の値と照合しnameたり、属性リストで一致を検索したりできます。これは読者の演習として残しておきますが、次の方法で作業を開始できます。

$node->attributes();
于 2013-11-11T20:15:48.793 に答える