在Flex中将分层数据转换为XML(Converting Hierarchical Data to XML in Flex)

编程入门 行业动态 更新时间:2024-10-27 07:29:07
在Flex中将分层数据转换为XML(Converting Hierarchical Data to XML in Flex)

如何在Flex中将平面/分层数据转换为XML格式。 以下是我的分层数据:(表格式)

Asia India Chennai TN Category1 Product1 100 Asia India Mumbai MH Category1 Product1 100 Asia India Calcutta CT Category1 Product1 100 Asia India Calcutta CT Category2 Product2 200 EMEA UK London LN Category3 Product1 123 EMEA UK London LN Category3 Product2 455 EMEA UK Reading RN Category1 Product1 500 EMEA UK Reading RN Category1 Product2 430 I need to format/convert this to XML format so that I can populate that resulting xml as dataprovider to a Tree control. Asia India Chennai TN Category1 Product1 100 Mumbai MH Category1 Product1 100 such a tree structure.

How to convert a flat/hierarchical data to XML format in Flex. The following is my Hierarchical Data:(Table format)

Asia India Chennai TN Category1 Product1 100 Asia India Mumbai MH Category1 Product1 100 Asia India Calcutta CT Category1 Product1 100 Asia India Calcutta CT Category2 Product2 200 EMEA UK London LN Category3 Product1 123 EMEA UK London LN Category3 Product2 455 EMEA UK Reading RN Category1 Product1 500 EMEA UK Reading RN Category1 Product2 430 I need to format/convert this to XML format so that I can populate that resulting xml as dataprovider to a Tree control. Asia India Chennai TN Category1 Product1 100 Mumbai MH Category1 Product1 100 such a tree structure.

最满意答案

我会做一个简单的转换器来获得真正的XML结构。 解决方案的复杂性取决于您拥有的源文本。

这是我的实施。

假设您的分层数据结构良好,并且每个元素之前都有一定数量的空格。 在我的情况下,我使用4个空格作为一个级别转换。

我从文本文件加载数据,如下所示:

Asia India Chennai TN Category1 Product1 100 Mumbai MH Category2 Product2 200 Category3 Product3 300 Product4 400

然后我浏览每个字符串并分析其级别。 生成的树看起来像这样:

在此处输入图像描述

//应用程序

<?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600" creationComplete="init(event)"> <fx:Script> <![CDATA[ import mx.events.FlexEvent; private const SPACEDELIMITER:int = 4; private var loader:URLLoader; private var ar:Array = new Array(); [Bindable]private var data:XML = <Root/>; private var inputStr:String; protected function init(event:FlexEvent):void { loader = new URLLoader(new URLRequest("com/treexml/tree.txt")); loader.dataFormat = URLLoaderDataFormat.TEXT; loader.addEventListener(Event.COMPLETE, completeHandler); } private function completeHandler(event:Event):void { inputStr = URLLoader(event.target).data; parseString(); } private function parseString():void { var levels:Array = new Array(); ar = inputStr.split("\r\n"); var reg:RegExp = /[a-z0-9]/gi; var globalShift:int = String(ar[0]).search(reg); for (var i:int = 0; i < ar.length; i++) { var item:String = ar[i]; var shift:int = item.search(reg); //amount of witespaces before the text var level:int = (shift - globalShift)/SPACEDELIMITER; //level of the node var label:String = item.substring(shift, item.length); levels[level] = i; //id of the last element for the given level var node:XML = new XML(); node = <child id = {i} label = {label}/>; if (level == 0) data.appendChild(node); else data..child.(@id == levels[level - 1]).appendChild(node); } } ]]> </fx:Script> <mx:Tree width="250" height="400" dataProvider="{data.child}" labelField="@label"/> </s:Application>

//编辑

如果您的数据未通过空格对齐,请尝试使用另一版本的parseString函数。

假设您的数据如下:

Asia India Chennai TN Category1 Product1 100 Asia India Mumbai MH Category1 Product1 100 Asia India Calcutta CT Category1 Product1 100 Asia India Calcutta CT Category2 Product2 200 EMEA UK London LN Category3 Product1 123 EMEA UK London LN Category3 Product2 455 EMEA UK Reading RN Category1 Product1 500 EMEA UK Reading RN Category1 Product2 430

功能是:

private function parseString():void { ar = inputStr.split("\r\n"); var map:Dictionary = new Dictionary(); var delimiter:String = "***"; var id:int = 0; for (var i:int = 0; i < ar.length; i++) { if(ar[i].length){//if it's not an empty string var itemArray:Array = ar[i].replace(/\s{2,}/g, ' ').split(" ");//collapse multiple spaces as one using RegEx var key:String = ""; var prevkey:String = ""; for (var j:int = 0; j< itemArray.length; j++) { prevkey = key; key += itemArray[j] + delimiter; if (map[key] == null) { map[key] = id; var node:XML = <child id = {id} label = {itemArray[j]}/>; if (j == 0) data.appendChild(node); else data..child.(@id == map[prevkey]).appendChild(node); id++; } } } } }

I would make a simple converter to get a real XML structure. The complexity of the solution depends on the source text you have.

Here is my implementation.

Suppose your hierarchical data is good structured and each element has a certain amount of whitespaces before. In my case I use 4 whitespaces as one level shift.

I load the data from a text file, which looks like this:

Asia India Chennai TN Category1 Product1 100 Mumbai MH Category2 Product2 200 Category3 Product3 300 Product4 400

Then I go through each string and analyse its level. The resulting tree looks like this:

enter image description here

// Application

<?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600" creationComplete="init(event)"> <fx:Script> <![CDATA[ import mx.events.FlexEvent; private const SPACEDELIMITER:int = 4; private var loader:URLLoader; private var ar:Array = new Array(); [Bindable]private var data:XML = <Root/>; private var inputStr:String; protected function init(event:FlexEvent):void { loader = new URLLoader(new URLRequest("com/treexml/tree.txt")); loader.dataFormat = URLLoaderDataFormat.TEXT; loader.addEventListener(Event.COMPLETE, completeHandler); } private function completeHandler(event:Event):void { inputStr = URLLoader(event.target).data; parseString(); } private function parseString():void { var levels:Array = new Array(); ar = inputStr.split("\r\n"); var reg:RegExp = /[a-z0-9]/gi; var globalShift:int = String(ar[0]).search(reg); for (var i:int = 0; i < ar.length; i++) { var item:String = ar[i]; var shift:int = item.search(reg); //amount of witespaces before the text var level:int = (shift - globalShift)/SPACEDELIMITER; //level of the node var label:String = item.substring(shift, item.length); levels[level] = i; //id of the last element for the given level var node:XML = new XML(); node = <child id = {i} label = {label}/>; if (level == 0) data.appendChild(node); else data..child.(@id == levels[level - 1]).appendChild(node); } } ]]> </fx:Script> <mx:Tree width="250" height="400" dataProvider="{data.child}" labelField="@label"/> </s:Application>

//EDIT

If your data is not aligned by means of whitespaces, try to use another edition of the parseString function.

Suppose your data looks like:

Asia India Chennai TN Category1 Product1 100 Asia India Mumbai MH Category1 Product1 100 Asia India Calcutta CT Category1 Product1 100 Asia India Calcutta CT Category2 Product2 200 EMEA UK London LN Category3 Product1 123 EMEA UK London LN Category3 Product2 455 EMEA UK Reading RN Category1 Product1 500 EMEA UK Reading RN Category1 Product2 430

The function is:

private function parseString():void { ar = inputStr.split("\r\n"); var map:Dictionary = new Dictionary(); var delimiter:String = "***"; var id:int = 0; for (var i:int = 0; i < ar.length; i++) { if(ar[i].length){//if it's not an empty string var itemArray:Array = ar[i].replace(/\s{2,}/g, ' ').split(" ");//collapse multiple spaces as one using RegEx var key:String = ""; var prevkey:String = ""; for (var j:int = 0; j< itemArray.length; j++) { prevkey = key; key += itemArray[j] + delimiter; if (map[key] == null) { map[key] = id; var node:XML = <child id = {id} label = {itemArray[j]}/>; if (j == 0) data.appendChild(node); else data..child.(@id == map[prevkey]).appendChild(node); id++; } } } } }

更多推荐

Product,format,Category,Asia,电脑培训,计算机培训,IT培训"/> <meta name="

本文发布于:2023-07-28 04:30:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1300361.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:转换为   中将   数据   Flex   Data

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!