【问题标题】:To flat XML: How could we flat all the descendants of an xml and get a xmllist扁平化 XML:我们如何扁平化 xml 的所有后代并获得 xmllist
【发布时间】:2011-12-31 19:40:27
【问题描述】:

目的是从 xml 中获取平面 xmllist:xmllist 的每个项目都是 xml 的后代(不仅仅是子项)。这样我在 xmllist 中就有了一个 xml 的所有节点。

例如:

XML=
<a >
  <b >
   <b1/>
   <b2>
     <c1 />
     <c2 />
   </b2>
  </b>
</a>

What I want is:

 <a />
 <b />
 <b1 />
 <b2 />
 <c1 />
 <c2 />
 <b2 />

【问题讨论】:

    标签: xml actionscript-3 apache-flex xml-serialization


    【解决方案1】:

    怎么样

    xml.descendants("*")
    

    ?在我看来,这可以满足您的要求,因为返回的 xmlllist 的每个项目都是 xml 的后代,并且您将在 xmllist 中拥有 xml 的所有(元素)节点。

    如果您的意思是除了元素之外还需要其他节点,请指定。许多人用“节点”松散地表示“元素”。

    【讨论】:

    • 我用一个例子更新了我的问题:请注意 xml.descendats(*) 不会给出这种扁平结构。我想我需要为此编写一个递归UDF?谢谢。
    • @user503510:好的。我现在更了解您的要求。请参阅 weltraumpirat 的回答。
    【解决方案2】:

    这个任务比仅仅遍历xml.descendants(*) 更复杂的原因有两个:

    1. 您不能简单地使用生成的 XMLList 中的项目或克隆它们,因为每个项目都会带来其子级和子层次结构 - 相反,您必须复制每个元素及其名称和属性,但忽略其他所有内容。最简单的方法是将名称和属性附加到字符串,然后使用new XML(String) 创建 XML 元素。

    2. 您明确希望结果是 XMLList,与 Array 或 Vector 不同,它没有添加或删除元素的方法,因此不容易创建和/或修改。所有的项目都需要先附加到一个父节点,然后xml.children()可以用来返回一个XMLList对象。

    我已经编写了一个小程序,它可以返回您想要的扁平结构,并且还包含属性。但是,您的示例结果中的最后一个 &lt;b2 /&gt; 将比源 XML 最初的元素多一个 - 所以我认为它是错误地进入那里的,我没有将它包含在我的解决方案中。

    package
    {
        import flash.display.Sprite;
    
        public class FlattenXML extends Sprite
        {
            private var _xml : XML = <a>
                    <b>
                        <b1 />
                        <b2>
                            <c1 />
                            <c2 />
                        </b2>
                    </b>
                </a>;
    
            public function FlattenXML ()
            {
                trace ( flatXMLList ( _xml ) );
            }
    
            private function flatXMLList ( xml : XML ) : XMLList
            {
                var root : XML = <all />;
                root.appendChild ( new XML ( flatNodeString ( xml ) ) );
                for each (var child:XML in _xml.descendants ( "*" ))
                {
                    if (child.nodeKind () == "element") 
                         root.appendChild ( new XML ( flatNodeString ( child ) ) );
                }
    
                return root.children ();
            }
    
            private function flatNodeString ( xml : XML ) : String
            {
                var str : String = "<" + xml.name () + " ";
                for each ( var attr:XML in xml.attributes ()) 
                    str += attr.name () + "=\"" + attr.valueOf () + "\" ";
                str += " />";
                return str;
            }
        }
    }
    

    请注意,此示例将不包含任何文本节点,因为从您的示例看来,它似乎不需要。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-29
      • 1970-01-01
      • 2018-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多