1

これを尋ねるのはばかげていると感じますが、これまでのところ午後全体を無駄にしていて、まだ解決策に近づいていません。一部のJenkinsインスタンスのロールアウトを自動化しており、既存のジョブをコピーしたいと思います。

Perlスクリプトでconfig.xmlファイルを解析していて、特定の文字列要素を置き換える必要があります。

XML :: Simpleでほぼそこに到達しましたが、出力に必要なデータ構造が失われていることがわかりました。さらに読むと、これがXML::Simpleの仕組みであることがわかりました。だから私はXML::LibXMLを試し始めました

サンプル入力は次のようになります。

<project>
  <properties>
    <hudson.model.ParametersDefinitionProperty>
      <parameterDefinitions>
        <hudson.model.ChoiceParameterDefinition>
          <name>environment</name>
          <choices class="java.util.Arrays$ArrayList">
            <a class="string-array">
              <string>1</string>
              <string>2</string>
              <string>3</string>
              <string>4</string>
              <string>5</string>
            </a>
          </choices>
        </hudson.model.ChoiceParameterDefinition>
      </parameterDefinitions>
    </hudson.model.ParametersDefinitionProperty>
    <de.pellepelster.jenkins.walldisplay.WallDisplayJobProperty/>
  </properties>
</project>

たとえば、私が達成しようとしているのは、すべての<string>n</string> 要素を削除してから、いくつかの異なる要素を追加することです。

また、コードは比較的単純である必要があります。

my $p           = XML::LibXML->new;
my $d           = $p->parse_string($input);
my $params  = $d->findnodes('/project/properties/hudson.model.ParametersDefinitionProperty/parameterDefinitions/hudson.model.ChoiceParameterDefinition/choices');

これはノードリストを返します。しかし、私はこのリストにある要素を操作することができないようです。私がするなら

print $params->to_literal;

次に、操作したいデータがあることがわかります。しかし、私は次のステップを踏み出すのに苦労しています。誰かが私を正しい方向に向けるのを手伝ってもらえますか?

4

2 に答える 2

2

の下のタグを削除するXML ::Twigプログラムを次に示します。stringa

use v5.10;

my $xml = <<'HERE';
<project>
  <properties>
    <hudson.model.ParametersDefinitionProperty>
      <parameterDefinitions>
        <hudson.model.ChoiceParameterDefinition>
          <name>environment</name>
          <choices class="java.util.Arrays$ArrayList">
            <a class="string-array">
              <string>1</string>
              <string>2</string>
              <string>3</string>
              <string>4</string>
              <string>5</string>
            </a>
          </choices>
        </hudson.model.ChoiceParameterDefinition>
      </parameterDefinitions>
    </hudson.model.ParametersDefinitionProperty>
    <de.pellepelster.jenkins.walldisplay.WallDisplayJobProperty/>
  </properties>
</project>
HERE

use XML::Twig;

my $twig = XML::Twig->new(   
    twig_handlers => { 
        a   => sub {
            foreach my $child ( $_->children ) {
                say "Found ", $child->text;
                $child->cut;
                }
            },
      },
    pretty_print => 'indented',
    );

$twig->parse( $xml );
$twig->flush; 

タグ名とテキストを変更する場合、セットアップは同じですが、ハンドラーを少し変更します。

my $twig = XML::Twig->new(   
    twig_handlers => { 
        a   => sub {
            foreach my $child ( $_->children ) {
                $child->set_tag( 'new_name' );
                $child->set_text( $child->text ** 2 );
                }
            },
      },
    pretty_print => 'indented',
    );

DOM をどのように処理するかを決定すると、Twig が詳細を処理してそれを変更します。

于 2012-04-18T18:00:04.087 に答える
1

XML::LibXML::NodeオブジェクトnodeListのリストを取得します。やりたいことは、子ノードを渡す親ノードの関数を呼び出す各ノードを反復処理することです。removeChild

XML::LibXML を使用した例を次に示します。

my $params  = $d->findnodes('/project/properties/hudson.model.ParametersDefinitionProperty/parameterDefinitions/hudson.model.ChoiceParameterDefinition/choices/a');
foreach my $node ($params->[0]->childNodes()) {

    $params->[0]->removeChild($node);
}

要素の親ノードの名前は常に「a」であり、「choices」ノードの下にはノードが 1 つしかないと仮定しました。その後、 を使用して XML を再度印刷できますprint $d->toString();

于 2012-04-18T18:45:06.133 に答える