我正在尝试构建一个抽象方法,以按节点名称获取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);
}
答案 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());
希望这会有所帮助。