0

我正在尝试构建一个抽象方法来按节点名称获取 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);
}
4

2 回答 2

3

正如方法名称所说,child只会返回XML与给定参数匹配的对象的子项列表。如果您想获取具有给定名称的对象的所有后代(孩子、孙子、曾孙等),XML您应该使用descendants方法:

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

希望能帮助到你。

于 2012-05-18T06:33:47.400 回答
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());

希望这会有所帮助。

于 2012-05-18T11:39:35.513 回答