4

我想学习如何在 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的变量?

谢谢!

4

3 回答 3

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;
于 2009-05-29T16:28:08.373 回答
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”项和“non-rdf”项,因为它们的元素名称在其他方面相同,因此声明第二个命名空间允许您独立检索每个项。希望能帮助到你!

于 2009-05-28T20:41:57.317 回答
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::*;

你最好的选择就是玩弄它。但我确实喜欢过滤 xml 的前置逻辑语句使其更易于使用。

希望这能给你一些动态处理命名空间的想法

问候,

乔恩

于 2009-06-22T14:55:02.677 回答