I am trying to parse the PSE6 action xml (below) using Stdlib.xmlToObject but I don't seem to get anything under the 'global' object. global.name just returns blank. Can someone point me in the right direction?
Code: Select all<?xml version="1.0" encoding="UTF-8"?>
<PSEContent xmlns="http://ns.adobe.com/PSEContent/1.0/">
<global>
<name id="Name" value="ActionName" localize="true" />
<type value="effect" />
<typecategory id="TypeCat" value="ActionCategory" localize="true" />
</global>
</PSEContent>
Stdlib.xmlToObject
Stdlib.xmlToObject
My guess is X did not intend that function to parse xml with attributes. I imagine that he has other scripts for that purpose. This function looks to me like a helper function to convert simple xml to script parameter objects similar to the one in Adobe's Image Procssor.jsx.
I know that he is really busy with a project he is working on, so in the meantime here is my fix to that function until he has time to respond.
Code: Select allvar Stdlib = {};
Stdlib.xmlToObject = function(xml, obj, parent) {
if (xml.constructor == String) {
xml = new XML(xml);
} else if (xml instanceof XML) {
xml = xml.copy();
} else {
Error.runtimeError(2, "xml");
}
xml.normalize();
if (xml.hasSimpleContent()) {
var str = xml.toString();
if (parent) {
parent[xml.localName()] = str;
}
return str;
}
var type;
// do the eval because of non-CS/2 syntax
eval('type = xml.@type.toString()');
if (type == 'array') {
obj = [];
} else {
obj = {};
}
var els = xml.elements();
var len = els.length();
if (len > 0) {
for (var i = 0; i < len; i++) {
var child = els;
var val = '';
var idx = (type == 'array') ? i : child.localName();
if (child.hasComplexContent()) {
val = Stdlib.xmlToObject(child);
}
if (child.hasSimpleContent()) {
var ctype;
// do the eval because of non-CS/2 syntax
eval('ctype = child.@type.toString()');
val = child.text().toString();
if (val) {
if (ctype == 'number') {
val = Number(val);
}
if (ctype == 'boolean') {
val = val.toLowerCase() == 'true';
}
}
}
obj[idx] = val;
//mlh edit
if(child.attributes().length()>0){
obj[idx] = {};
for( var a = 0;a<child.attributes().length();a++ ){
obj[idx][child.attributes()[a].localName().toString()] = child.attributes()[a].toString();
}
}
// mlh edit ends
}
} else {
obj = xml.toString();
}
if (parent) {
parent[xml.localName()] = obj;
}
return obj;
};
var ax = '<?xml version="1.0" encoding="UTF-8"?><PSEContent xmlns="http://ns.adobe.com/PSEContent/1.0/"><global><name id="Name" value="ActionName" localize="true" /><type value="effect" /><typecategory id="TypeCat" value="ActionCategory" localize="true" /></global></PSEContent>';
var myXml = new XML(ax);
var myObj = Stdlib.xmlToObject(myXml);
alert( myObj.global.name.value )
I know that he is really busy with a project he is working on, so in the meantime here is my fix to that function until he has time to respond.
Code: Select allvar Stdlib = {};
Stdlib.xmlToObject = function(xml, obj, parent) {
if (xml.constructor == String) {
xml = new XML(xml);
} else if (xml instanceof XML) {
xml = xml.copy();
} else {
Error.runtimeError(2, "xml");
}
xml.normalize();
if (xml.hasSimpleContent()) {
var str = xml.toString();
if (parent) {
parent[xml.localName()] = str;
}
return str;
}
var type;
// do the eval because of non-CS/2 syntax
eval('type = xml.@type.toString()');
if (type == 'array') {
obj = [];
} else {
obj = {};
}
var els = xml.elements();
var len = els.length();
if (len > 0) {
for (var i = 0; i < len; i++) {
var child = els;
var val = '';
var idx = (type == 'array') ? i : child.localName();
if (child.hasComplexContent()) {
val = Stdlib.xmlToObject(child);
}
if (child.hasSimpleContent()) {
var ctype;
// do the eval because of non-CS/2 syntax
eval('ctype = child.@type.toString()');
val = child.text().toString();
if (val) {
if (ctype == 'number') {
val = Number(val);
}
if (ctype == 'boolean') {
val = val.toLowerCase() == 'true';
}
}
}
obj[idx] = val;
//mlh edit
if(child.attributes().length()>0){
obj[idx] = {};
for( var a = 0;a<child.attributes().length();a++ ){
obj[idx][child.attributes()[a].localName().toString()] = child.attributes()[a].toString();
}
}
// mlh edit ends
}
} else {
obj = xml.toString();
}
if (parent) {
parent[xml.localName()] = obj;
}
return obj;
};
var ax = '<?xml version="1.0" encoding="UTF-8"?><PSEContent xmlns="http://ns.adobe.com/PSEContent/1.0/"><global><name id="Name" value="ActionName" localize="true" /><type value="effect" /><typecategory id="TypeCat" value="ActionCategory" localize="true" /></global></PSEContent>';
var myXml = new XML(ax);
var myObj = Stdlib.xmlToObject(myXml);
alert( myObj.global.name.value )
Stdlib.xmlToObject
Thanks Mike. Its not working quite right yet though. Even if I use
Code: Select allvar pXML = Stdlib.readXMLFile(this.SCRIPTS_FOLDER + C_XML_PSE6)
to read it into a plain XML object I can't use pXML.global to retrieve that element. So I thought maybe something was badly formed in the XML, but I can't see anything??
Code: Select allvar pXML = Stdlib.readXMLFile(this.SCRIPTS_FOLDER + C_XML_PSE6)
to read it into a plain XML object I can't use pXML.global to retrieve that element. So I thought maybe something was badly formed in the XML, but I can't see anything??
Stdlib.xmlToObject
Are you using a different xml or the one you posted? It works for me with the xml you posted as either a string or from a file. I saved your sample xml to the Desktop as text.xml
Code: Select allvar Stdlib = {};
Stdlib.xmlToObject = function(xml, obj, parent) {
if (xml.constructor == String) {
xml = new XML(xml);
} else if (xml instanceof XML) {
xml = xml.copy();
} else {
Error.runtimeError(2, "xml");
}
xml.normalize();
if (xml.hasSimpleContent()) {
var str = xml.toString();
if (parent) {
parent[xml.localName()] = str;
}
return str;
}
var type;
// do the eval because of non-CS/2 syntax
eval('type = xml.@type.toString()');
if (type == 'array') {
obj = [];
} else {
obj = {};
}
var els = xml.elements();
var len = els.length();
if (len > 0) {
for (var i = 0; i < len; i++) {
var child = els;
var val = '';
var idx = (type == 'array') ? i : child.localName();
if (child.hasComplexContent()) {
val = Stdlib.xmlToObject(child);
}
if (child.hasSimpleContent()) {
var ctype;
// do the eval because of non-CS/2 syntax
eval('ctype = child.@type.toString()');
val = child.text().toString();
if (val) {
if (ctype == 'number') {
val = Number(val);
}
if (ctype == 'boolean') {
val = val.toLowerCase() == 'true';
}
}
}
obj[idx] = val;
//mlh edit
if(child.attributes().length()>0){
obj[idx] = {};
for( var a = 0;a<child.attributes().length();a++ ){
obj[idx][child.attributes()[a].localName().toString()] = child.attributes()[a].toString();
}
}
// mlh edit ends
}
} else {
obj = xml.toString();
}
if (parent) {
parent[xml.localName()] = obj;
}
return obj;
};
Stdlib.readXMLFile = function(fptr) {
var file = Stdlib.convertFptr(fptr);
if (!file.exists) {
Error.runtimeError(48); // File/Folder does not exist
}
file.encoding = "UTF8";
file.lineFeed = "unix";
file.open("r", "TEXT", "????");
var str = file.read();
file.close();
return new XML(str);
};
Stdlib.convertFptr = function(fptr) {
var f;
if (fptr.constructor == String) {
f = File(fptr);
} else if (fptr instanceof File || fptr instanceof Folder) {
f = fptr;
} else {
Error.runtimeError(19, "fptr");
}
return f;
};
var myXml = Stdlib.readXMLFile('~/Desktop/test.xml');
var myObj = Stdlib.xmlToObject(myXml);
alert( myObj.global.name.id );// alerts 'Name'
alert( myObj.global.typecategory.value );alerts 'ActionCategory'
Code: Select allvar Stdlib = {};
Stdlib.xmlToObject = function(xml, obj, parent) {
if (xml.constructor == String) {
xml = new XML(xml);
} else if (xml instanceof XML) {
xml = xml.copy();
} else {
Error.runtimeError(2, "xml");
}
xml.normalize();
if (xml.hasSimpleContent()) {
var str = xml.toString();
if (parent) {
parent[xml.localName()] = str;
}
return str;
}
var type;
// do the eval because of non-CS/2 syntax
eval('type = xml.@type.toString()');
if (type == 'array') {
obj = [];
} else {
obj = {};
}
var els = xml.elements();
var len = els.length();
if (len > 0) {
for (var i = 0; i < len; i++) {
var child = els;
var val = '';
var idx = (type == 'array') ? i : child.localName();
if (child.hasComplexContent()) {
val = Stdlib.xmlToObject(child);
}
if (child.hasSimpleContent()) {
var ctype;
// do the eval because of non-CS/2 syntax
eval('ctype = child.@type.toString()');
val = child.text().toString();
if (val) {
if (ctype == 'number') {
val = Number(val);
}
if (ctype == 'boolean') {
val = val.toLowerCase() == 'true';
}
}
}
obj[idx] = val;
//mlh edit
if(child.attributes().length()>0){
obj[idx] = {};
for( var a = 0;a<child.attributes().length();a++ ){
obj[idx][child.attributes()[a].localName().toString()] = child.attributes()[a].toString();
}
}
// mlh edit ends
}
} else {
obj = xml.toString();
}
if (parent) {
parent[xml.localName()] = obj;
}
return obj;
};
Stdlib.readXMLFile = function(fptr) {
var file = Stdlib.convertFptr(fptr);
if (!file.exists) {
Error.runtimeError(48); // File/Folder does not exist
}
file.encoding = "UTF8";
file.lineFeed = "unix";
file.open("r", "TEXT", "????");
var str = file.read();
file.close();
return new XML(str);
};
Stdlib.convertFptr = function(fptr) {
var f;
if (fptr.constructor == String) {
f = File(fptr);
} else if (fptr instanceof File || fptr instanceof Folder) {
f = fptr;
} else {
Error.runtimeError(19, "fptr");
}
return f;
};
var myXml = Stdlib.readXMLFile('~/Desktop/test.xml');
var myObj = Stdlib.xmlToObject(myXml);
alert( myObj.global.name.id );// alerts 'Name'
alert( myObj.global.typecategory.value );alerts 'ActionCategory'
Stdlib.xmlToObject
It is comming from a file. Trying to upload the actual file as an attachment...
Stdlib.xmlToObject
For what it is worth.. here's my actual test code just reading into an XML object. 'pGlobal' returns nothing, and the alert shows nothing.
Code: Select allvar pXMLFile = new File('~/Desktop/PSE6.xml');
var pXML = Stdlib.readXMLFile(pXMLFile);
var pGlobal = pXML.global
alert(pGlobal.name.@value)
Code: Select allvar pXMLFile = new File('~/Desktop/PSE6.xml');
var pXML = Stdlib.readXMLFile(pXMLFile);
var pGlobal = pXML.global
alert(pGlobal.name.@value)
Stdlib.xmlToObject
As I understand it, if a namespace is defined in the XML you have to use that Namespace in the elements name's.
Code: Select allvar pXMLFile = new File('~/Desktop/PSE6.xml');
var pXML = Stdlib.readXMLFile(pXMLFile);
var ns = new Namespace ("http://ns.adobe.com/PSEContent/1.0/");
var pGlobal = new XML(pXML.ns::global);
alert(pGlobal.ns::name.@value);
Did you want to use the XML in the file as XML or as an Object? When I used the zip you uploaded the alerts in xml to object code still work for me. Maybe I didn't construct the object as you expected.
Code: Select allvar pXMLFile = new File('~/Desktop/PSE6.xml');
var pXML = Stdlib.readXMLFile(pXMLFile);
var ns = new Namespace ("http://ns.adobe.com/PSEContent/1.0/");
var pGlobal = new XML(pXML.ns::global);
alert(pGlobal.ns::name.@value);
Did you want to use the XML in the file as XML or as an Object? When I used the zip you uploaded the alerts in xml to object code still work for me. Maybe I didn't construct the object as you expected.
Stdlib.xmlToObject
Running in the ESTK at the moment, although PS is the real aim
I'm happy to manipulate the XML object directly if I can that to work. I just want to update the name and category and write it out to a new file.
I'll try adding your namespace code and see how it goes.
I'm happy to manipulate the XML object directly if I can that to work. I just want to update the name and category and write it out to a new file.
I'll try adding your namespace code and see how it goes.
Stdlib.xmlToObject
This may not be the best way, but it makes sense to me to edit the xml as a whole. So I would not break out the global child.
Note I don't know any thing about PE6 actions so I may have edited the wrong attributes, but the concept is valid.
Code: Select all// @include '/C/Program Files/Adobe/xtools/xlib/stdlib.js'
var pXMLFile = new File('~/Desktop/PSE6.xml');
var pXML = Stdlib.readXMLFile(pXMLFile);
var ns = new Namespace ("http://ns.adobe.com/PSEContent/1.0/");
pXML.ns::global.ns::name.@value = 'newActionName';
pXML.ns::global.ns::typecategory.@value = 'newActionCategory';
Stdlib.writeXMLFile('~/Desktop/test.xml', pXML);// written to a different file for testing
var myXML = Stdlib.readXMLFile('~/Desktop/test.xml');
alert( myXML.ns::global.ns::name.@value );
Note I don't know any thing about PE6 actions so I may have edited the wrong attributes, but the concept is valid.
Code: Select all// @include '/C/Program Files/Adobe/xtools/xlib/stdlib.js'
var pXMLFile = new File('~/Desktop/PSE6.xml');
var pXML = Stdlib.readXMLFile(pXMLFile);
var ns = new Namespace ("http://ns.adobe.com/PSEContent/1.0/");
pXML.ns::global.ns::name.@value = 'newActionName';
pXML.ns::global.ns::typecategory.@value = 'newActionCategory';
Stdlib.writeXMLFile('~/Desktop/test.xml', pXML);// written to a different file for testing
var myXML = Stdlib.readXMLFile('~/Desktop/test.xml');
alert( myXML.ns::global.ns::name.@value );