按名称获取子节点的XMLList的抽象方法

时间:2012-05-17 21:00:40

标签: xml actionscript-3 xml-parsing e4x

我正在尝试构建一个抽象方法,以按节点名称获取XML对象中的所有节点。我不提前知道XML的结构。

因此,使用此代码,我想获得所有“item”节点和所有“x”节点的列表:

var xml:XML = <root><items><item/><item/><item><x/><item><item><x/></item></items></root>
var nodeName:String;
var list:XMLList;


list = getNodeByName(xml, "item"); // contains no results
list = getNodeByName(xml, "x"); // contains no results

// what am i doing wrong here?
public static function getNodeByName(xml:XML, nodeName:String):XMLList {
     return xml.child(nodeName);
}

2 个答案:

答案 0 :(得分:3)

正如方法的名称所示,child将仅返回与给定参数匹配的XML对象的子项列表。如果你想获得具有给定名称的XML对象的所有后代(子,孙子,曾孙等),你应该使用descendants方法:

public static function getNodeByName(xml:XML, nodeName:String):XMLList {
     return xml.descendants(nodeName);
}

希望它有所帮助。

答案 1 :(得分:1)

您是否希望将来自不同父项的同名节点连接到一个XML结构中?在这种情况下,你可以做的是:

    public static function getNodesByName(myXML_:XMLList, nodeName_:String) : XMLList {
        var result:XMLList = new XMLList();
        for (var i1:Number = 0; i1 < myXML_.children().length(); i1++ ) {
            if (myXML_.children()[i1].name() == nodeName_) {
                result += myXML_.children()[i1].valueOf();
            } else if (myXML_.children()[i1].children()) { 
                result += getNodesByName(XMLList(myXML_.children()[i1].valueOf()), nodeName_);
            }
        }
        return result;
    }

它将返回XMLList,其中包含具有指定名称的所有节点。像这样使用它:

var nodesList:XMLList = getNodesByName(myXML.children(), "myNodeName").valueOf();

如果您想将该列表转换为XML,那么:

var myXMLListTurnedIntoXML:XML = XML("<xml></xml>");
myXMLListTurnedIntoXML.appendChild(getNodesByName(myXML.children(), "myNodeName").valueOf());

希望这会有所帮助。