Короткий ответ заключается в том, что если у вас уже есть объявленный namespaceURI и префикс, вы можете указать полное имя (т.е. prefix: 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, позволяющие использовать несколько словарей вместе в одном XML-документ. Для этого вводится концепция namespaceURI (nsURI) и механизм указания того, какой nsURI относится к каким элементам и атрибутам в XML-документе, модифицируется в XML. Для этого используется тот факт, что имена атрибутов, начинающиеся с 'xml' зарезервированы, что позволяет использовать специальное имя атрибута (xmlns) без риска столкновения.
Общая идея состоит в том, что можно связать каждый словарь, используемый в XML-документе, с уникальным nsURI (который рассматривается как непрозрачная строка). Элемент head в словаре XHTML полностью определяется {'http://www.w3.org/1999/xhtml ':' head '}, и это явно отличается от головы в (гипотетической) anatomy-ML {' my-made-up-URI ':' head '}. Проблема в том, как встроить nsURI в XML-документ и как связать их с именами элементов.
Один из способов установить связь между nsURI и именем элемента - добавить к элементу атрибут xmlns. Например:
<name xmlns="http://xmlns.com/foaf/0.1/">Evan Carroll</name>
говорит, что 'name' находится в 'http://xmlns.com/foaf/0.1/ 'пространство имен. Объявления пространств имен наследуются дочерними элементами, поэтому 'age' находится в том же пространстве имен:
<name xmlns="http://xmlns.com/foaf/0.1/">Evan Carroll<age years='21'/></name>
Это может хорошо работать и быть довольно компактным. Однако это не работает для атрибутов и может стать беспорядочным, если множеству узлов-братьев нужно изменить пространство имен от их общего родителя. Для решения обеих этих проблем введен NamespacePrefix (nsPrefix). Это придает двоеточию особое значение. Идея состоит в том, чтобы связать nsURI со строкой, которая используется в текущем документе. Это не имеет особого значения за пределами документа и не должно уточняться в словаре (но иногда это так, обсуждение в другом месте). Особенно часто все nsURI объявляются в корневом элементе. Синтаксис состоит в том, чтобы объявить пространство имен следующим образом:
xmlns:prefix="http://xmlns.com/foaf/0.1/"
и используйте его в именах атрибутов и элементов, добавив nsPrefix к имени:
<prefix:name prefix:attribute='value'/>
Поскольку точное значение nsPrefixes не имеет значения, API обычно не упрощают доступ / настройку к ним (Xpath - хороший пример). Наличие пространств имен приводит к некоторым ограничениям в документе, которые следует рассматривать как ошибки, например, использование префикса, который не определен. Но такой документ может быть правильно сформирован в соответствии со спецификацией XML (помните, что пространства имен модернизируются). Вы можете описать такой документ как «некорректно сформированное пространство имен».
Разбор документа, который использует пространства имен, с помощью парсера, который ничего не знает о пространствах имен, очевидно, проще, если вы заранее знаете используемые префиксы пространств имен. Но это довольно хрупкое решение, поскольку префиксы пространства имен могут меняться в нечетных местах при многократной обработке XML-документа. Большинство парсеров осведомлены о пространстве имен.
person
Andrew Walker
schedule
02.03.2010
foaf:
, иxmlns=
могут быть исключены и все еще иметь рабочий документ foaf. - person Evan Carroll   schedule 02.03.2010<foaf:name>foo</name>
было тем же самым, что и<name xmlns="http://foaf..">foo</name>
, и, более того, таким же, как<foaf:Person><name>foo</name></Person>
- person Evan Carroll   schedule 03.03.2010