我想学习如何在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 的变量?
谢谢!
答案 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,这使得它更容易使用。
希望这能为您提供动态处理命名空间的一些想法
的问候,
乔恩