Archive for the “XML” Category

When I'm writing a script to read XML data, I personally like the identification of node names and attributes to be case-insensitive. Its one less thing to worry about when others are modifying the XML data that my script will have to read and render, and I think they feel modifying the XML to be more user-friendly this way. :)

Here, the example scripts pull a list of all the nodes with the name "MEDIA".
Using Regular Expressions, you can identify each "MEDIA" node regardless of its letter case.

 
var doc:XML=
<DATA>
	<CATEGORY>
		<MEDIA>A.jpg</MEDIA>
		<MEDIA>B.jpg</MEDIA>
	</CATEGORY>
	<CATEGORY>
		<MEDIA>C.jpg</MEDIA>
	</CATEGORY>
	<CATEGORY>
		<MEDIA>D.jpg</MEDIA>
	</CATEGORY>
	<CATEGORY>
		<MEDIA>E.jpg</MEDIA>
	</CATEGORY>
</DATA>;
 
var findName:String="media";
trace(doc..*.(new RegExp(findName,"i")["test"](name())).toXMLString());
 

:( "Error #1069: Property lowerCase not found on QName"

 
trace(doc..*.(name().lowerCase()=="media").toXMLString());
 

:( Letter case must be same for this to work.

 
trace(doc..*.(name()=="MEDIA").toXMLString());
 

Used a regular expression to do case-insensitive filter
:| Works, letter case does not matter...but the expression is too "hardcoded".

 
trace(doc..*.(/media/i.test(name())).toXMLString());
 

:-? Works, but compiler does not like it:
"Warning: 3594: test is not a recognized method of the dynamic class RegExp."
This is an attempt to allow variables and expressions.

 
var findName:String="media";
trace(doc..*.(new RegExp(findName,"i").test(name())).toXMLString());
 

:jumping: Works!
"[" and "]" keeps the compiler from warning when using the RegExp "test()" method.
Now letter case does not matter, and RegExp constructor allows variables or expressions.

 
var findName:String="media";
trace(doc..*.(new RegExp(findName,"i")["test"](name())).toXMLString());
 

Comments 1 Comment »

The XML examples represent a book in a library. However the book has several bookworms in it.
Using E4X we can find these bookworms.

 
<library>
	<book>
<page id="one"/>
		<worm name="Eddy" />
<page id="two"/>
<page id="three">
			<worm name="Lisa"/>
			<worm name="Pete" />
		</page>
<page id="four"/>
	</book>
</library>
 

There are some E4X operators and XML methods to help use do this when combined together:

.. Access all descendants of the XML object.
. Access a property of an Object or XML.
* Wildcard, match any part of the XML.
childIndex() Index number of an XML object relative to its parent node.
name() Name of the XML node.

Read the rest of this entry »

Comments 4 Comments »

These are some functions I wrote for finding and replacing parts of XML using AS3.
Not sure if E4X or "XML.replace()" method can be used to make each function's task better.

 
/*-----------------------------------
	Recursively replace nodeNames.
-------------------------------------*/
      private function findAndReplaceTagNames
      (xml:XML,find:String,replace:String):XML
      {
          if(xml.localName() == find){
              xml.setLocalName(replace);
          }
          var n:int=0;
          var c:XML;
          while(n <xml.children().length()){
              c=xml.children()[n];
              findAndReplaceTagNames(c,find,replace);
              n++;
          }
          return xml;
      }
 
/*-----------------------------------------
	Recursively replace attributes.
-------------------------------------------*/
      private function findAndReplaceAttributeNames
      (xml:XML,find:String,replace:String,in_tags_named:String=""):XML
      {
          var ok:Boolean=true;
          if(in_tags_named != "" && xml.localName() != in_tags_named){
              ok=false;
          }
          if(xml.@[find] != null && ok){
              xml.@[replace]=xml.@[find];
              delete xml.@[find];
          }
          var n:int=0;
          var c:XML;
          while(n <xml.children().length()){
              c=xml.children()[n];
              findAndReplaceAttributeNames(c,find,replace);
              n++;
          }
          return xml;
      }
 
/*---------------------------------------------
	Recursively find and remove attributes.
-----------------------------------------------*/
      private function findAndRemoveAttributeNames
      (xml:XML,find:String,in_tags_named:String=""):XML
      {
          var ok:Boolean=true;
          if(in_tags_named != "" && xml.localName() != in_tags_named){
              ok=false;
          }
          if(xml.@[find] != null && ok){
              delete xml.@[find];
          }
          var n:int=0;
          var c:XML;
          while(n <xml.children().length()){
              c=xml.children()[n];
              findAndRemoveAttributeNames(c,find);
              n++;
          }
          return xml;
      }
 

Comments No Comments »

Thanks for visiting www.keith-hair.net