2

私は FOAF と Perl でいくつかのことをしようとしています。現在のソリューションに不満があり、独自のソリューションを展開したいと考えています。以外のモジュールを参照しないでくださいXML::LibXML

参考までに、FOAF ファイルのスニペットを以下に示します。

<rdf:RDF
      xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
      xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
      xmlns:foaf="http://xmlns.com/foaf/0.1/"
      xmlns:admin="http://webns.net/mvcb/">

  <foaf:Person rdf:ID="me">
  <foaf:name>Evan Carroll</foaf:name>
....

今、空白を除いて、これをXML::LibXML. ただし、残念ながら最初の行で立ち往生しています。これは最初の行に焦点を当てています:

私はこれを

  1. element RDF、名前空間でrdf宣言
    1. 値を持つrdf名前空間の属性xmlnshttp://www.w3.org/1999/02/22-rdf-syntax-ns#
    2. 値を持つrdfs名前空間の属性xmlnshttp://www.w3.org/2000/01/rdf-schema#
    3. 値を持つfoaf名前空間の属性xmlnshttp://xmlns.com/foaf/0.1/
    4. 値を持つadmin名前空間の属性xmlnshttp://webns.net/mvcb/

最初に要素が必要ですがrdf:RDF、これは難しいようです。私が見つけたのドキュメントを読んでいますが、これは私が望むことをしていないようです:XML::LibXML::DocumentcreateElementNS()

use XML::LibXML;
my $doc = XML::LibXML::Document->new( '1.0', 'UTF-8' );
my $foaf = $doc->createElementNS( 'RDF', 'rdf' );
print $foaf->toString; # prints <rdf xmlns="RDF"/>

今、私は試しcreateElement('rdf:RDF')てみましたが、うまくいきます!ルート要素を取得しましたrdf:RDF。これがルート要素を作成する方法ですか? XML の読み方が間違っているだけですか?

ここで、属性 (スキーマ宣言) を作成する必要があります。XML::LibXML::Document文書化が不十分な を試しましたcreateAttributeNSが、どちらも機能しませんでした:

my $doc = XML::LibXML::Document->new( '1.0', 'UTF-8' );
my $foaf = $doc->createElement( 'rdf:RDF' );
$doc->createAttributeNS( 'http://www.w3.org/1999/02/22-rdf-syntax-ns#', 'rdf' );

実際、「属性に新しい名前空間を作成できません!」というエラーが表示されます。これは、メソッド名が意味するものと、ドキュメントの説明「名前空間にバインドされた属性を作成する」と矛盾しているようです。

それで、私はわかりました、私はできませんcreateattributeNS多分私はそれからできsetますattributeNS。そして、今回は適用可能と思われる次の文書化された方法に進みますXML::LibXML::Element: setAttributeNS.

my $doc = XML::LibXML::Document->new( '1.0', 'UTF-8' );
my $foaf = $doc->createElement( 'rdf:RDF' );
$foaf->setAttributeNS( 'http://www.w3.org/1999/02/22-rdf-syntax-ns#', 'rdf' );

今回は別のエラーが表示されます: 「ns 属性が正しくありません!」. そこで、いくつかのテストを見直したところ、これには名前空間宣言以外の属性キー値が必要であることがわかりました..これは私が望んでいるものではありません.

考えられる組み合わせと出力は次のとおりです。

$foaf->setAttributeNS( http://www.w3.org/1999/02/22-rdf-syntax-ns#', 'rdf:', undef );
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" rdf:=""/>

$foaf->setAttributeNS( 'http://www.w3.org/1999/02/22-rdf-syntax-ns#', 'rdf:foo', 'bar' );
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" rdf:foo="bar"/>

XML名前空間に関連していることはわかっていますが、*NSメソッドはどれも機能していないようです。最後に、非 NS バージョンを試します。

my $doc = XML::LibXML::Document->new( '1.0', 'UTF-8' );
my $foaf = $doc->createElement( 'rdf:RDF' );
$foaf->setAttribute( 'xmlns:rdf', 'http://www.w3.org/1999/02/22-rdf-syntax-ns#' );
print $foaf->toString; # <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"/>

私はこれを正しく行っていないという恐ろしい気持ちになります。私はこれを正しく行いましたか?DOM を使用して (を使用せずに) 子要素を追加するにはどうすればよいappendTextChildですか?

この全体XML::LibXML非常に不十分に文書化されていますが、DOM を使用して高速に XML を作成するために Perl が提供する最高のもののようです。

4

1 に答える 1