E4X: захватить узлы с пространствами имен? - PullRequest
4 голосов
/ 28 мая 2009

Я хочу узнать, как обрабатывать 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 ]

7 голосов
/ 29 мая 2009

Если у вас есть 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;
4 голосов
/ 29 мая 2009

Я не уверен, что это точно отвечает на вопрос, но с учетом вашего сценария следующий код извлекает оба значения (учитывая, что переменная "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», поскольку имена их элементов в остальном идентичны, поэтому объявляется второе пространство имен, позволяющее вам извлекать каждый элемент независимо. Надеюсь, это поможет!

2 голосов
/ 22 июня 2009

Если вы не знаете пространства имен, с которым вам приходится иметь дело, существует множество методов, которые вы можете использовать.

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

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

С уважением,

Jon

...