E4X:抓住带名称空间的节点?

时间:2009-05-28 19:11:45

标签: xml flex actionscript-3 namespaces e4x

我想学习如何在E4X中使用命名空间处理XML,所以基本上这就是我想要学习的东西,比如我有一些像这样的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 个答案:

答案 0 :(得分:7)

如果您的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;

答案 1 :(得分:4)

我不确定这是否完全回答了这个问题,但考虑到你的场景,下面的代码检索这两个值(给定“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 :(得分:2)

如果您不知道必须处理的命名空间,可以使用各种方法。

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::*;

你最好的选择就是玩弄它。但是我喜欢使用prediate逻辑语句来过滤xml,这使得它更容易使用。

希望这能为您提供动态处理命名空间的一些想法

的问候,

乔恩