Search code examples
javascriptxmladobe-illustratorextendscriptadobe-scriptui

How insert,update,delete value of an XML element with Extendscript scriptui


I am learning extendscript for scripting adobe illustrator.It is very difficult for me to write xml related parsing. My problem statement is given below:- "I have taken three text boxes namely name,city and country."name" is a unique key.when i click ok button the data must be saved in xml if name does not exist else update the previous name with out creating duplicate.All the names in xml file are displayed in list box.The date of particular name could be deleted by remove button.which will remove data in selected item of list box. The code i tried to do is:-

   var myWindow = new Window ("dialog", "Form");
   var txt1 = myWindow.add ("edittext");//name unique
   var txt2 = myWindow.add ("edittext");//city
   var txt3 = myWindow.add ("edittext");//country
   var btn=myWindow.add ("button", undefined, "OK");
   btn.onClick = function () {
   for (i=0;i<numberofnamesinxml;i++)//coding required
   {
      if(txt1.text!=xmlname[i]) // to verify name not there since it is like      primary key
       xmlFile.open("a");  
       xmlFile.write(root.toXMLString());
       xmlFile.copy ('C:/data.xml');
       xmlFile.close();
      //myList refresh
   }
}
   var myList = myWindow.add ("listbox");
   for (i=0;i<numberofnamesinxml;i++)//coding required
   {
       config='C:/data.xml';
       config.open("r");  
       data= xmlname[i] //here i need to set data to  
       config.close();  
       myList.add ("item", data);
   }
   var btn1=myWindow.add ("button", undefined, "remove");
   btn1.onClick = function () {
   myList.remove (myList1.selection[i]);
   //xml data having this list name must be removed
   }
   myWindow.show ();

Please kindly help me.


Solution

  • This should not be considered a full answer. I still post it because it might help finding one.

    This is what I tried to write as an answer. The read/write part works but the checking of an element exists fails. if the child is not an exact match, xml.contains(xml) will not return true.

    var path = '~/Desktop/test.xml';
    var xmlfile = File(path);
    if (!xmlfile.exists) {
      $.writeln('xml file does not exist. Creating new one');
      xmlfile = new File(path);
      xmlfile.open('w');
      xmlfile.write('<Root></Root>');
      xmlfile.close();
    }
    xmlfile.open('r');
    xmlcontent = xmlfile.read();
    xmlfile.close();
    //$.writeln(xmlcontent);
    var xml = new XML(xmlcontent);
    
    // here the problems start
    // the check is only working for known elements
    var child = new XML('<name data="bob"></name>');
    if (xml.contains(child)) {
      child.@data = 'jim';
      $.writeln('A child called "name" exists. Update');
      xml.replace('name', child);
    } else {
      $.writeln('no child called "name" exists. Append');
      child.@data = 'bob';
      xml.appendChild(child);
    }
    xmlfile.open('w');
    xmlfile.write(xml.toXMLString());
    xmlfile.close();
    

    My real answer is: Use JSON instead.