0

これは、私が疑問に思っている動作を再現するコード サンプルです。

#!/usr/bin/perl
use strict;
use warnings;

use XML::LibXML;

my $myXMLdocument = XML::LibXML::Document->new();

my $myXML = $myXMLdocument->createElement("myXML");
$myXMLdocument->addChild($myXML);

my $element = $myXMLdocument->createElement("element");
$myXML->addChild($element);

my $node = $myXMLdocument->createElement("node");
$element->addNewChild('', $node);
$node->addNewChild('', $myXMLdocument->createAttribute( "key" => "value"));

print "$myXMLdocument->toString(2)\n";

出力 :

XML::LibXML::Document=SCALAR(0x8f5a6f8)->toString(2)

これは、 によって渡されるドキュメント構造のある種のハンドルであることを理解していますXML::LibXML

toStringでは、人間が読める XML にシリアル化しないのはなぜでしょうか?

私は非常にナイーブかもしれませんXML::LibXML; BashのエコーでランダムなXMLを吐き出す代わりに、これを使用するのはこれが初めてです。

4

1 に答える 1

4

これは基本的なPerlの問題であり、。とは特別な関係はありませんXML::LibXML。Perlは、引用符で囲まれた文字列内の単純な変数を展開しますが、関数呼び出しは展開しません。コードをに変更した場合

print $myXMLdocument->toString(2), "\n";

その後、必要な結果が得られます。


アップデート

モジュールを少し間違って使用しています。これらの行

my $node = $myXMLdocument->createElement("node");
$element->addNewChild('', $node);
$node->addNewChild('', $myXMLdocument->createAttribute( "key" => "value"));

新しい要素$nodeを作成し、を呼び出しaddNewChildてに追加し$elementます。ただしaddNewChild、2番目のパラメーターとしてタグ名を使用するため、Perlは$nodeオブジェクトを文字列化して、表示される奇妙なタグ名を付けます。代わりにあなたは必要です

my $node = $myXMLdocument->createElement('node');
$element->addChild($node);
$node->addChild($myXMLdocument->createAttribute(key => 'value'));

またはあなたは固執しaddNewChildて書くことができます

my $node = $element->addNewChild('', 'node');
$node->setAttribute(key => 'value');

アップデート

XMLを作成XML::APIするための私の好みのモジュールを検討することをお勧めします。簡潔なコードが可能であり、バッファにテキストを追加するだけでなく、適切なXMLデータツリーを構築するため、見た目よりもはるかに微妙です。より複雑な構造の場合は、ツリー内のノードに戻ってデータを追加できる方法があります。_goto

use strict;
use warnings;

use XML::API;

my $xml = XML::API->new;
$xml->myXML_open;
$xml->element_open;
$xml->node({ key => 'value' });
$xml->element_close;
$xml->myXML_close;

print $xml;

出力

<?xml version="1.0" encoding="UTF-8" ?>
<myXML>
  <element>
    <node key="value" />
  </element>
</myXML>
于 2013-02-19T10:30:18.767 に答える