私は 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
. ただし、残念ながら最初の行で立ち往生しています。これは最初の行に焦点を当てています:
私はこれを
- element
RDF
、名前空間でrdf
宣言- 値を持つ
rdf
名前空間の属性xmlns
http://www.w3.org/1999/02/22-rdf-syntax-ns#
- 値を持つ
rdfs
名前空間の属性xmlns
http://www.w3.org/2000/01/rdf-schema#
- 値を持つ
foaf
名前空間の属性xmlns
http://xmlns.com/foaf/0.1/
- 値を持つ
admin
名前空間の属性xmlns
http://webns.net/mvcb/
- 値を持つ
最初に要素が必要ですがrdf:RDF
、これは難しいようです。私が見つけたのドキュメントを読んでいますが、これは私が望むことをしていないようです:XML::LibXML::Document
createElementNS()
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' );
実際、「属性に新しい名前空間を作成できません!」というエラーが表示されます。これは、メソッド名が意味するものと、ドキュメントの説明「名前空間にバインドされた属性を作成する」と矛盾しているようです。
それで、私はわかりました、私はできませんcreate
、attributeNS
多分私はそれからでき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 が提供する最高のもののようです。