Newsgroup: it.comp.lang.javascript
Titolo: [Mozilla] Metodo migliore per manipolare XML

Mi servirebbe capire e sapere qual'è il metodo più veloce e meno
consuma risorse per manipolare file xml
di grosse dimensioni (attorno a 2 mb).
Ad esempio per prendere tutti gli elementi in base al valore di un loro
attributo, oppure per prendere un elemento
in base al testo contenuto e poi dopo la ricerca cosa è meglio per
rimuovere/aggiungere e modificare elementi.
Al momento mi pare che abbiamo ben 4 strade:
1) Usando il DOM
2) Usando XPath
3) Usando E4X
4) Usando XSLT
Esistono benchmark a riguardo? Se non sapete di performance avete
indicazioni almeno sul metodo secondo voi più pratico.
Giusto per capire includo uno script non finito che stavo facendo per
schiarimi le idee. Purtroppo per fare una cosa
decente mi serve molto più tempo del poco che adesso ho dedicato.
Grazie.
/**
 * Test best methods for manipulate xml
 *
 */
function XmlTest(fileName) {
	this.fileContentXml = null;
	this.fileContentText = null;
	this.fileContentDom = null;
	this.fileContentE4x = null
	this.xmlFileName = fileName;
}
XmlTest.prototype.loadXml = function() {
	req = new XMLHttpRequest();
	req.open("GET",this.xmlFileName,false);
	req.send(null);
	if(req.status == 200) {
		this.fileContentXml = req.responseXML;
		this.fileContentText = req.responseText;
		this.fileContentDom = new
DOMParser().parseFromString(req.responseText, 'text/xml');
		this.fileContentE4x = new XML(removeDecalaration(req.responseText));
	}
}
XmlTest.prototype.getElByAttributeValue =
function(tag,attribute,value,mode) {
	var res = null;
	switch(mode) {
		case "e4x":
			res = this.e4xGetElByAttributeValue(tag,attribute,value);
			break;
		case "xpath":
			res = this.xpathGetElByAttributeValue(tag,attribute,value);
			break;
		case "dom":
			res = this.domGetByAttributeValue(tag,attribute,value);
			break;
		default:
			alert("Mode not available");
	}
	return res;
}
XmlTest.prototype.getByTagValue = function(tag,value) {
}
XmlTest.prototype.domGeEltByAttributeValue =
function(tag,attribute,value) {
	var nodes = this.fileContentXml.getElementsByTagName(tag);
	var res = null;
	for(var i=0;i<nodes.length;i++) {
		if(nodes[i].getAttribute(attribute) == value) {
			res = nodes[i];
			break;
		}
	}
	return res;
}
XmlTest.prototype.e4xGetElByAttributeValue =
function(tag,attribute,value) {
	var res = null;
	//res = this.fileContentE4x.employee.(@id=="emp3");
	res = this.fileContentE4x.eval(tag + '.(@'+ attribute + '=="' + value
+ '")')
	return res;
}
XmlTest.prototype.xpathGetElByAttributeValue =
function(tag,attribute,value) {
	//eg: employee[@id='emp1']
	var path = "//" + tag + "[@" + attribute + "='" + value + "']" ;
	//var res = evaluateXPath(this.fileContentXml,path);
	res =
this.fileContentXml.evaluate(path,this.fileContentXml,null,XPathResult.ANY_TYPE,null).iterateNext();
	return res
}
XmlTest.prototype.getByTagName = function(tagName,mode) {
}
function serializeXml(xmlDoc) {
	var str = null;
	if(xmlDoc) {
		var s = new  XMLSerializer();
		try {
			str = s.serializeToString(xmlDoc);
		}catch(e){
			alert(e);
		}
	}
	return str;
}
function evaluateXPath(aNode, aExpr) {
  var xpe = new XPathEvaluator();
  var nsResolver = xpe.createNSResolver(aNode.ownerDocument == null ?
    aNode.documentElement : aNode.ownerDocument.documentElement);
  var result = xpe.evaluate(aExpr, aNode, nsResolver, 0, null);
  var found = [];
  var res;
  while (res = result.iterateNext())
    found.push(res);
  return found;
}
function removeDecalaration(strXml) {
	var xmlDeclaration = /^<\?xml version[^>]+?>/;
 	return strXml.replace(xmlDeclaration, '');
}
/**********************************************/
var obj = new XmlTest("emp.xml");
var mode = "xpath";
obj.loadXml();
var res = obj.getElByAttributeValue("employee","id","emp3",mode);
// firefox -console dump should be enabled
dump("\nResult " + mode + ":" + serializeXml(res));

 Esistono benchmark a riguardo? 
Non lo so, ma se ne trovi - o in futuro ne farai qualcuno - ti prego di
comunicarmene i risultati, perché mi interessa.
-- 
"Your sin is beyond the grace of God" ~ Ky Kiske

Allego anche xml con cui ho fatto le prove. Quello di sopra sono solo
delle bozze.
<?xml version="1.0" encoding="UTF-8"?>
<employees>
  <employee id="emp1">
    <name>Kurt Cagle</name>
    <title>Architect</title>
    <building>4</building>
  </employee>
  <employee id="emp2">
    <name>Aleria Delamare</name>
    <title>Graphic Artist</title>
    <building>5</building>
  </employee>
  <employee id="emp3">
    <name>Michael Norris</name>
    <title>Account Executive</title>
    <building>5</building>
  </employee>
  <employee id="emp4">
    <name>Fred Marshal</name>
    <title>Group Manager</title>
    <building>4</building>
  </employee>
</employees>

 comunicarmene i risultati, perché mi interessa.
Se trovo qualcosa te lo comunico. Non penso di farne io perchè fare
benchmark seri è un lavoro lungo.

 benchmark seri è un lavoro lungo.
Mi vanno bene anche degli stress test. :)
