Skip navigation
Currently Being Moderated

filter xml

Jul 25, 2012 1:59 PM

Tags: #actionscript3

Hello dear people

 

, I have a question, I want to filter an xml data which is loaded in a datagrid, but I want to filter this data for search the names

 

 

Is it posible filter in a text input?, I have search it in many ways, but there is not found much about it. this is my code. Thanks in advance for any help.

 

Regards

Joselyn

 

 

import fl.controls.DataGrid;
import fl.controls.dataGridClasses.DataGridColumn;
import fl.controls.TextInput;
import fl.data.DataProvider;
import flash.net.URLRequest;
import flash.net.URLLoader;

 

var dp:DataProvider = new DataProvider();

 

//Create and populate a new DataProvider object.
var itemTextInput:TextInput = new TextInput();
itemTextInput.addEventListener(Event.CHANGE, changeHandler);

var colTF:TextFormat = new TextFormat();
colTF.bold = false;
colTF.indent = 5;
colTF.size = 11;
colTF.color = 0x000000;
colTF.font = "Verdana";

 

var col2TF:TextFormat = new TextFormat();
col2TF.bold = false;
col2TF.indent = 5;
col2TF.size = 11;
col2TF.color = 0x000000;
col2TF.font = "Verdana";

 

var dg:DataGrid = new DataGrid();
dg.setSize(800, 200);
dg.move (0, 100);

var nameCol:DataGridColumn = new DataGridColumn("names");
nameCol.headerText = "Name ";

var descCol:DataGridColumn = new DataGridColumn("address");
domCol.headerText = "Address";

dg.addColumn(nameCol);
dg.addColumn(domCol);

 

 

dg.setRendererStyle("textFormat", colTF);
dg.setRendererStyle("textFormat", col2TF);

dg.rowHeight = 22;
dg.headerHeight = 30;


addChild(dg);

var xml:XML;
var url:String = "xmls/othersnames.xml";
var urlXML:URLRequest = new URLRequest(url);
var loader:URLLoader = new URLLoader();
loader.load(urlXML);

 

function Cargar(event):void
{

 

 

var xml:XML = new XML (loader.data);
var dp:DataProvider = new DataProvider(xml);
dg.dataProvider = dp;
dp.sortOn("name", Array.CASEINSENSITIVE);
dg.rowCount = dp.length;
}

loader.addEventListener(Event.COMPLETE, Cargar);

 

// textInput  changeHandler function

 

function changeHandler(event:Event):void {
var xml:XML = new XML (loader.data);
var dp:DataProvider = new DataProvider(xml);
dg.dataProvider = dp;
var arr:Array = dp.toArray();
var filteredArr:Array = arr.filter(filterDataProvider);
dg.dataProvider = new DataProvider(filteredArr);
}

function filtering(obj:Object, idx:int, arr:Array):Boolean
{

var txt1:String = itemTextInput.text;
var txt2:String = obj.name.substr(0, txt1.length);
if (txt1.toLowerCase() == txt2.toLowerCase()) {
  return true;
}
return false;
}

 
Replies
  • kglad
    62,050 posts
    Jul 21, 2002
    Currently Being Moderated
    Jul 25, 2012 5:25 PM   in reply to Joselyn6

    what's your xml look like?

     
    |
    Mark as:
  • kglad
    62,050 posts
    Jul 21, 2002
    Currently Being Moderated
    Jul 26, 2012 5:06 PM   in reply to Joselyn6

    if you want to filter on the name attributes, use:

     

    function changeHandler(event:Event):void {

    var xml:XMLList = XMLList(loader.data.name.(@name.indexOf(whateverfilteringtext)>-1));

    var dp:DataProvider = new DataProvider([xml@name,xml@address]);  // you may want to switch rows and columns which would look like:

    /*

    var a:Array = [];

    for(var i:int=0;i<xmlList.length();i++){

    a[i] = [xmlList[i].@name,xmlList[i].@address]

    }

    var dp:DataProvider=new DataProvider(a);

    */

    dg.dataProvider = dp;

    }

     
    |
    Mark as:
  • kglad
    62,050 posts
    Jul 21, 2002
    Currently Being Moderated
    Jul 28, 2012 12:36 PM   in reply to Joselyn6

    whateverfilteringtext is not a function.  it's the string you want to use as your filter.  but you could use a function if it returns a string.

     

    from the look of your code that would be something like itemTextinput.text.

     

    i'm not sure what you're trying to do with your test of txt1.toLowerCase() and txt2.toLowerCase().

     
    |
    Mark as:
  • kglad
    62,050 posts
    Jul 21, 2002
    Currently Being Moderated
    Jul 30, 2012 2:31 PM   in reply to Joselyn6

    if TextInput is your input textfield that you want to use to filter your xml, use the following.  don't change the code.  just copy and paste it. 

     

    the only thing you should change is TextInput if that's not the name of your input textfield;

     

    function changeHandler(event:Event):void {

    var xml:XMLList = XMLList(loader.data.name.(@name.indexOf(TextInput.text)>-1));

    var dp:DataProvider = new DataProvider([xml@name,xml@address]);  // you may want to switch rows and columns which would look like:

    /*

    var a:Array = [];

    for(var i:int=0;i<xmlList.length();i++){

    a[i] = [xmlList[i].@name,xmlList[i].@address]

    }

    var dp:DataProvider=new DataProvider(a);

    */

    dg.dataProvider = dp;

    }

     

    // don't worry about upper and lower case or whether the user's input matches the start of the xml name, yet.  just get the basics working.  then you can fine tune the code.

     
    |
    Mark as:
  • kglad
    62,050 posts
    Jul 21, 2002
    Currently Being Moderated
    Jul 31, 2012 1:31 PM   in reply to Joselyn6

    use:

     

     

    // textInput  changeHandler function

    function changeHandler(event:Event):void {

     

    var xml:XMLList = XMLList(loader.data.name.(@name.indexOf(itemTextInput.text)>-1));

    var dp:DataProvider = new DataProvider([xml.@name,xml.@address]); 

     

    // you may want to switch rows and columns which would look like:

     

    /*

    var a:Array = [];

    for(var i:int=0;i<xmlList.length();i++){

     

      a[i] = [xmlList[i].@name,xmlList[i].@address]

    }

     

    var dp:DataProvider=new DataProvider(a);

     

    */

     

    dg.dataProvider = dp;

    }

     

     
    |
    Mark as:
  • kglad
    62,050 posts
    Jul 21, 2002
    Currently Being Moderated
    Aug 1, 2012 12:14 PM   in reply to Joselyn6

    is changeHandler called?  (use the trace function)

     
    |
    Mark as:
  • kglad
    62,050 posts
    Jul 21, 2002
    Currently Being Moderated
    Aug 2, 2012 12:39 PM   in reply to Joselyn6

    what's the trace output from:

     

    function changeHandler(event:Event):void {

    trace(itemTextInput.text)

        var xml:XML = XML(loader.data);

        var xmlList:XMLList = XMLList(xml.name.(@name.indexOf(itemTextInput.text)>-1));

        var a:Array = [];

        for(var i:int=0;i<xmlList.length();i++){

              a[i] = {names: xmlList[i].@name, address: xmlList[i].@address};

        }

    trace(a.length)

        var dp:DataProvider=new DataProvider(a);

        dg.dataProvider=dp;

    }

     
    |
    Mark as:
  • kglad
    62,050 posts
    Jul 21, 2002
    Currently Being Moderated
    Aug 3, 2012 1:05 PM   in reply to Joselyn6

    if you don't see a trace output, you're not changing the text property of itemTextInput (or you failed to add that change listener where needed).

     

    here's what you should be doing:  www.kglad.com/Files/forums/dg.zip

     

    p.s.  please mark helpful/correct responses.

     
    |
    Mark as:
  • kglad
    62,050 posts
    Jul 21, 2002
    Currently Being Moderated
    Aug 3, 2012 3:35 PM   in reply to Joselyn6

    you're welcome.

     

    (but, you marked your thank you as the correct answer.)

     
    |
    Mark as:

More Like This

  • Retrieving data ...

Bookmarked By (0)

Answers + Points = Status

  • 10 points awarded for Correct Answers
  • 5 points awarded for Helpful Answers
  • 10,000+ points
  • 1,001-10,000 points
  • 501-1,000 points
  • 5-500 points