使用perl';如何使用XML前缀而不是xmlns属性?

使用perl';如何使用XML前缀而不是xmlns属性?,xml,perl,libxml2,xml-namespaces,Xml,Perl,Libxml2,Xml Namespaces,我相信这个问题在另一个网站上。但是,我当前的XML/RDF编写器(XML::LibXML1.70)以xmlns属性的形式输出元素名称空间。这将排除使用非名称空间感知解析器的人,他们只需查找foaf:Person。我想知道是否有人知道用perl实现这一点的简单方法,首先,使用XML::LibXML。或者通过不同的方式 像这样的节点: <Person xmlns="http://xmlns.com/foaf/0.1/" rdf:ID="me"/> 而且,这: <nam

我相信这个问题在另一个网站上。但是,我当前的XML/RDF编写器(
XML::LibXML
1.70)以xmlns属性的形式输出元素名称空间。这将排除使用非名称空间感知解析器的人,他们只需查找
foaf:Person
。我想知道是否有人知道用perl实现这一点的简单方法,首先,使用
XML::LibXML
。或者通过不同的方式

像这样的节点:

  <Person xmlns="http://xmlns.com/foaf/0.1/" rdf:ID="me"/>

而且,这:

  <name xmlns="http://xmlns.com/foaf/0.1/">Evan Carroll</name>
埃文·卡罗尔 应该看起来像:

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

埃文·卡罗尔

有什么想法吗?我相信这两种方法在技术上都是正确的,但我更不希望别人知道这一点。我昨天自己也不知道。

简单的回答是,如果已经声明了namespaceURI和前缀,可以指定限定名(即前缀:localName)作为元素名,这将使XML::LibXML避免重新声明名称空间。因此,修改上一个问题中的代码会得到以下结果,其中确实使用了所需的名称空间前缀:

#! /usr/bin/perl 
use warnings;
use strict;
use XML::LibXML;
my $doc = XML::LibXML::Document->new( '1.0', 'UTF-8' );
my $foaf = $doc->createElementNS( 'http://www.w3.org/1999/02/22-rdf-syntax-ns#', 'RDF' );
$doc->setDocumentElement( $foaf );
$foaf->setNamespace( 'http://www.w3.org/1999/02/22-rdf-syntax-ns#' , 'rdf', 1 );
$foaf->setNamespace( 'http://www.w3.org/2000/01/rdf-schema#' , 'rdfs', 0 );
$foaf->setNamespace( 'http://xmlns.com/foaf/0.1/' , 'foaf', 0 );
$foaf->setNamespace( 'http://webns.net/mvcb/' , 'admin', 0 );
my $node = $doc->createElementNS( 'http://xmlns.com/foaf/0.1/', 'foaf:Person');
$foaf->appendChild($node);
$node->setAttributeNS( 'http://www.w3.org/1999/02/22-rdf-syntax-ns#', 'ID', 'me');
my $node2 = $doc->createElementNS( 'http://xmlns.com/foaf/0.1/', 'foaf:name');
$node2->appendTextNode('Evan Carroll');
$node->appendChild($node2);
print $doc->toString;

不过,或许值得回顾一下目前的情况。允许在同一XML文档中同时使用多个词汇表。为了实现这一点,引入了namespaceURI(nsURI)的概念,并提供了一种机制,用于指示哪个nsURI与XML文档中的哪些元素和属性相关,并将其改装为XML。要做到这一点,需要使用以“xml”开头的属性名,这样就可以使用特殊属性名(xmlns),而不会有冲突的风险

一般的想法是,可以将XML文档中使用的每个词汇表与唯一的nsURI(被视为不透明字符串)链接起来。XHTML词汇表中的head元素完全由{'':'head'}定义,这显然不同于(假设的)解剖ML{'my-make-up-URI':'head'}中的head元素。问题是如何在XML文档中嵌入nsURI,以及如何将它们链接到元素名称

在nsURI和元素名之间建立链接的一种方法是向元素添加xmlns属性。例如:

<name xmlns="http://xmlns.com/foaf/0.1/">Evan Carroll</name>
并通过在名称前加nsPrefix在属性和元素名称中使用:

<prefix:name prefix:attribute='value'/>

因为nsPrefixes的确切值并不重要,API通常不会使访问/设置它们变得非常容易(Xpath就是一个很好的例子)。使用名称空间会导致对文档的一些约束,这些约束应被视为错误,例如使用未定义的前缀。但是,根据XML规范,这样的文档可以格式良好(记住名称空间是经过改进的)。您可以将此类文档描述为“格式不正确”


如果您事先知道使用的名称空间前缀,那么使用不了解名称空间的解析器解析使用名称空间的文档显然更容易。但这是一个相当脆弱的解决方案,因为在重复处理XML文档时,命名空间前缀可能会在奇怪的地方发生变化。大多数解析器都支持名称空间

我甚至不确定这是否正确。我完全糊涂了,我和艾凡在一起。你错了-你试图将一个有效的FOAF文档转换成一个无效的文档。人们使用不知道名称空间的“XML解析器”不是你的问题,如果是的话,你不应该试图通过破坏你的东西来修复它。你是和提出问题的Evan“在一起”还是和第一个发表评论的Evan“在一起”?我不确定您认为谁是“错的”,但(有时)有合理的理由严格控制命名空间声明。这可以通过XML::LibXML的DOM绑定实现。就我所见,通过使用此控件,没有任何东西会被“破坏”。@reinierpost,这是我的困惑:(a)我不想依赖支持XML-NS的foaf机器人。(b) 我不知道或者在视觉上不喜欢冗余的xmlns属性,并且(c)我不知道
foaf:
xmlns=
都可以被排除,并且仍然有一个工作的foaf文档。我和commenter Evan在一起,因为您永远不应该更改元素上的名称空间,但你的回答正是提问者埃文想要的。非常感谢。我真的很感激你的回答。
xmlns:prefix="http://xmlns.com/foaf/0.1/"
<prefix:name prefix:attribute='value'/>