Graal Forums  

Go Back   Graal Forums > Development Forums > NPC Scripting > Code Gallery
FAQ Members List Calendar Today's Posts

 
 
Thread Tools Search this Thread Display Modes
Prev Previous Post   Next Post Next
  #1  
Old 08-23-2006, 11:00 AM
Tolnaftate2004 Tolnaftate2004 is offline
penguin.
Join Date: Jul 2004
Location: Berkeley, CA
Posts: 534
Tolnaftate2004 is a jewel in the roughTolnaftate2004 is a jewel in the rough
Send a message via AIM to Tolnaftate2004
XML Parser

parseXML()

Description
Here is a little code that can transform an XML file into something that GScript can understand. The format is similar to that of ActionScript's XML Object.
XML.childNodes is an array of entities within the XML object.
XML.parent is the parent entity of the XML object.
XML.nodeName is the name of entity within the XML object.
XML.nodeType is an integer representing the type of the XML object (1 for plain text, 2 for XML entity).
XML.nodeValue is the XML object / plain text nested within the XML object.
XML.attributes is a string in the pattern of var1=val1&var2=val2&...&varN=valN. Variables can also be read with XML.attributes.var.
XML.xmlDecl is the XML declaration of the XML object.
XML.docTypeDecl is the DTD of the XML object.

Except nodeType, None of these values are read only.


The Code
PHP Code:
function parseXML(strXML) {
  temp.xml = strXML;
  this.childNodes = new [0];
  temp.intOTag = temp.xml.pos("<");
  temp.intETag = temp.xml.pos(">");
  temp.intPrev = -1;
  if (temp.intOTag == -1) {
    this.childNodes.add(temp.xml);
    this.childNodes[++temp.intPrev].type = 1;
  } else {
    while (temp.intOTag > -1) {
      if (temp.intOTag > 0) {
        this.childNodes.add(temp.xml.substring(0,temp.intOTag));
        this.childNodes[++temp.intPrev].type = 1;
        this.childNodes[temp.intPrev].parent = this;
        temp.xml = temp.xml.substring(temp.intOTag);
        temp.intOTag = temp.xml.pos("<");
        temp.intETag = temp.xml.pos(">");
      }
      temp.strTag = temp.xml.substring(1,temp.intETag-1);
      temp.strTagName = temp.strTag.substring(0,temp.strTag.pos(" ")).trim();
      temp.strTag = temp.strTag.substring(temp.strTagName.length());
      this.childNodes[temp.intPrev].nodeName = temp.strTagName;
      if (!temp.strTagName.starts("?xml") && temp.strTagname != "!DOCTYPE" && !temp.strTagName.starts("!--") && !temp.strTagName.starts("!CDATA[")) {
        if (temp.strTag != " /") {
          temp.xml = temp.xml.substring(temp.intETag+1);
          temp.strXMLCopy = temp.xml;
          temp.intDepth = 1;
          do {
            temp.intOPos = temp.strXMLCopy.pos("<" @ temp.strTagName);
            temp.intEPos = temp.strXMLCopy.pos("</" @ temp.strTagName @ ">");
            if (temp.intOPos == -1) temp.intOPos = temp.strXMLCopy.length()+1;
            switch (temp.intOPos < temp.intEPos) {
              case true:
                temp.intDepth ++;
                temp.strXMLCopy = temp.strXMLCopy.substring(temp.strXMLCopy.substring(temp.intOPos+1).pos(">")+1);
                break;
              case false:
                temp.intDepth --;
                temp.strXMLCopy = temp.strXMLCopy.substring(temp.strXMLCopy.substring(temp.intEPos+1).pos(">")+1);
                break;
            }
          } while (temp.intDepth > 0);
          temp.strChild = temp.xml.substring(0,temp.intEPos);
          temp.xml = temp.xml.substring(temp.intEPos+3+temp.strTagName.length());
          this.childNodes.add("<" @ temp.strTagName @ temp.strTag @ ">" @ temp.strChild @ "</" @ temp.strTagName @ ">");
          with(this.childNodes[++temp.intPrev]) parseXML(temp.strChild);
          this.childNodes[temp.intPrev].type = 2;
          this.childNodes[temp.intPrev].nodeName = temp.strTagName;
          this.childNodes[temp.intPrev].parent = this;
          this.childNodes[temp.intPrev].nodeValue = temp.strChild;
        } else {
          this.childNodes.add("<" @ temp.strTagName @ temp.strTag @ ">");
          this.childNodes[++temp.intPrev].nodeName = temp.strTagName;
          this.childNodes[temp.intPrev].nodeType = 2;
          this.childNodes[temp.intPrev].parent = this;
          temp.xml = temp.xml.substring(temp.intETag+1);
        }
        with(this.childNodes[temp.intPrev].attributes) getAttributes(temp.strTag);
      } else {
        switch (temp.strTagName) {
          case "?xml": 
            this.xmlDecl = "<?xml" @ temp.strTag @ ">";
            with (this.xmlDecl.attributes) getAttributes(temp.strTag);
            break;
          case "!DOCTYPE":
            this.docTypeDecl = "<!DOCTYPE" @ temp.strTag @ ">";
            break;
        }
        if (temp.strTagName == "!--") temp.intETag = temp.xml.pos("-->") + 2;
        elseif (temp.strTagName == "!CDATA[") temp.intETag = temp.xml.pos("]>") + 1;
        temp.xml = temp.xml.substring(temp.intETag+1);
      }
      temp.intOTag = temp.xml.pos("<");
      temp.intETag = temp.xml.pos(">");
    }
    if (temp.xml.length() > 0) {
      this.childNodes.add(temp.xml);
      this.childNodes[temp.intPrev].type = 1;
      this.childNodes[temp.intPrev].parent = this;
      temp.xml = "";
    }
  }
  return strXML;
}

function getAttributes(strTag) {
  temp.arr = "";
  while(strTag.length() > 0) {
    strTag = strTag.trim();
    temp.pos = strTag.pos("=");
    if (temp.pos > -1) {
      temp.var = strTag.substring(0,temp.pos);
      if (strTag.charat(temp.pos+1) == "\"") temp.npos = strTag.substring(temp.pos+2).pos("\"");
      else temp.npos = strTag.substring(temp.pos+2).pos(" ");
      temp.val = strTag.substring(temp.pos+2,temp.npos);
      this.(@temp.var) = temp.val;
      temp.arr.add(temp.var @ "=" @ temp.val);
      strTag = strTag.substring(temp.npos+temp.pos+3).trim();
    } else strTag = "";
  }
  temp.len = temp.arr.size();
  temp.str = temp.arr[0];
  for (temp.i=1;temp.i<temp.len;temp.i++)
    temp.str @= "&" @ temp.arr[temp.i];
  this = temp.str;
  return;
}
Usage
with(var) this = parseXML(strXML);

Parameters
strXML A string of XML or well-formed HTML.

Returns
The parameter passed to the function.

Example
PHP Code:
function onCreated() {
  
temp.query requesturl("http://www.w3schools.com/xml/note.xml"); /* import file lines */
  
catchevent(temp.query,"onReceiveData","onData");
}

function 
onData(obj) {
  
with(methis parseXML(obj.fulldata); /* parse */
  
echo(me.xmlDecl.attributes.version); /* prints "1.0" */



The scene is set; to remake the XML file, you're going to have to get creative. Post problems / comments / etc.
__________________
◕‿‿◕ · pfa · check yer syntax! · src

Killa Be: when i got that locker in 6th grade the only thing in it was a picture of a midget useing a firehose :/

Last edited by Tolnaftate2004; 08-23-2006 at 08:47 PM..
Reply With Quote
 


Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT +2. The time now is 07:32 PM.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2026, vBulletin Solutions Inc.
Copyright (C) 1998-2019 Toonslab All Rights Reserved.