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, с ним намного легче работать.

надеюсь, это даст вам некоторые идеи для динамической обработки пространств имен

С уважением,

Джон

Другие вопросы по тегам