我正在尝试用 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
. 但是,不幸的是,我被困在了第一行。这仅关注第一行:
我读到这是
- 元素
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/
首先你需要一个 element 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
的 'screateAttributeNS
但它也不起作用:
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"/>
似乎 *NS 方法都不起作用,即使我知道它们与 XML 命名空间有关。最后,我尝试了非 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
的文档很差,但似乎是 Perl 为使用 DOM 快速创建 XML 提供的最好的东西。