2012-05-17 36 views
0

我试图构建一个抽象方法,通过节点名称获取XML对象中的所有节点。我不提前知道XML的结构。所以用这个代码按名称获取子节点的XMLList的抽象方法

我想获得的所有“项目”节点和所有的“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

你能否避免在编译时通过的代码?谢谢。 这避免浪费时间。 rbyte的答案应该可以帮助你。 – tatactic

+0

@ tatactic如果您怀疑它是错误的,请不要更改代码:问题可能基于这种错误。如果您怀疑问题中存在拼写错误,只需发表评论,并询问在原始代码中是否存在错误。 – Nanne

+0

我应该提到那是伪代码。谢谢 –

回答

3

正如方法的名字说,child只会返回一个列表XML对象的子对象与给定参数匹配。如果你想获得XML对象的所有后代(子女,孙子,曾孙等)使用相同的名字,你应该使用descendants方法:

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

希望它能帮助。

+0

谢谢你是 –

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和所有具有指定名称的节点。如果您想打开该列表转换成XML然后

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

:使用这样的

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

希望这将有助于。

+0

。感谢卢卡斯。 –