E4X: захватить узлы с пространствами имен?
Я хочу научиться обрабатывать XML с помощью пространств имен в E4X, так что в основном вот что я хочу изучить, скажем, у меня есть такой XML:
<rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns="http://purl.org/rss/1.0/">
<rdf:item value="5"/>
<item value="10"/>
</rdf:RDF>
Как я мог назначить <rdf:item/>
к переменной под названием rdfItems и <item/>
к вар под названием regItems?
Спасибо!
3 ответа
Я не уверен, что это точно отвечает на вопрос, но с учетом вашего сценария следующий код извлекает оба значения (учитывая, что переменная "xml", ссылка на которую приведена ниже, является объектом XML, содержащим фрагмент предоставленного вами кода XML):
// Your "rdf" namespace
namespace rdf = "http://www.w3.org/1999/02/22-rdf-syntax-ns#";
use namespace rdf;
// Your "reg" (i.e, default) namespace
namespace reg = "http://purl.org/rss/1.0/";
use namespace reg;
private function getYourValues():void
{
var rdfitems:String = xml.rdf::item.@value;
var regitems:String = xml.reg::item.@value;
}
Необходимо проводить различие между элементом "rdf" и "не-rdf", поскольку имена их элементов в остальном идентичны, поэтому объявляется второе пространство имен, позволяющее вам извлекать каждый элемент независимо. Надеюсь, поможет!
Если у вас есть XML, который содержит несколько имен, но вы не заботитесь о пространствах имен при получении значений из XML, вы можете сделать следующее...
Пример XML
<ns1:Item>
<ns1:ItemType>Printed Material</ns1:ItemType>
<ns2:Book isbn="123456">
<ns2:Author>
<ns2:FirstName>James</ns2:FirstName>
<ns2:LastName>Smith</ns2:LastName>
</ns2:Author>
<ns2:Title>The Book Title</ns2:Title>
</ns2:Book>
<ns1:Item>
Вы можете получить любой предмет независимо от пространства имен, как это
var itemType:String = xml.*::ItemType;
var bookISBN:Number = xml.*::Book.@isbn;
var bookTitle:String = xml.*::Book.Title;
Если вы не знаете пространства имен, с которым вам приходится иметь дело, существует множество методов, которые вы можете использовать.
node.namespace().prefix //returns prefix i.e. rdf
node.namespace().uri //returns uri of prefix i.e. http://www.w3.org/1999/02/22-rdf-syntax-ns#
node.inScopeNamespaces() //returns all inscope namespace as an associative array like above
//returns all nodes in an xml doc that use the namespace
var nsElement:Namespace = new Namespace(node.namespace().prefix,
node.namespace().uri);
var usageCount:XMLList = node..nsElement::*;
Лучше всего просто поиграть с этим. Но мне действительно нравится предикатное логическое утверждение, чтобы фильтровать xml, с ним намного легче работать.
надеюсь, это даст вам некоторые идеи для динамической обработки пространств имен
С уважением,
Джон