我想用FOAF和Perl做一些事情。我對目前的解決方案不滿意,我想推出自己的解決方案。請不要參考XML::LibXML
以外的任何模塊。使用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
與命名空間xmlns
值http://xmlns.com/foaf/0.1/
- 屬性
admin
與價值http://webns.net/mvcb/
- 屬性
首先你需要一個元素rdf:RDF
,這似乎是棘手。讀documentation爲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');
這次我收到另一個錯誤:「bad ns attribute!」。所以我回顧了一些測試,發現這需要一個屬性key-value而不是名稱空間聲明來做我想做的事情。這不是我想要的。
下面是一些可能的組合和輸出:
$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創建。
由於Evan明確地禁止了它,所以我不會提到任何其他模塊,但是我會注意到,在使用RDF時,特定於RDF的模塊會更好,特別是因爲XML是RDF的糟糕序列化。 – MkV 2010-03-01 22:41:16
我正在爲FOAF做這個,如果你知道它比XML更廣泛的採用,那就去做吧!如果不是,我想要做的就是創建一個模型,它會在TT和Catalyst中爲您提供FOAF和HCARD模板和渲染。更具體地說,創建社交網絡類型的東西,並迎合可以利用它的爬蟲(谷歌地圖) – 2010-03-01 23:20:52