DOM y XMLData
La interfaz XMLData ofrece total acceso a la estructura XML del documento actual con menos métodos que DOM y de manera mucho más sencilla. La interfaz XMLData ofrece una manera minimalista de leer y modificar datos XML nuevos o ya existentes. Sin embargo, puede usar la estructura DOM si quiere tener acceso desde una fuente de datos externa o si prefiere la implementación MSXML DOM.
Las funciones ProcessDOMNode() y ProcessXMLDataNode() que aparecen más abajo convierten los segmentos de una estructura XML de XMLData a DOM.
Para usar la función ProcessDOMNode():
•pase el elemento raíz del segmento DOM que quiere convertir en objNode y
•pase el objeto del complemento con el método CreateChild() en objCreator
Para usar la función ProcessXMLDataNode():
•pase el elemento raíz del segmento XMLData en objXMLData y
•pase el objeto DOMDocument creado con MSXML en xmlDoc
Conversión de DOM en XMLData
El siguiente código muestra cómo convertir segmentos DOM en XMLData.
////////////////////////////////////////////////////////////////
// conversión de segmentos DOM en XMLData
function ProcessDOMNode(objNode,objCreator)
{
var objRoot;
objRoot = CreateXMLDataFromDOMNode(objNode,objCreator);
if(objRoot) {
if((objNode.nodeValue != null) && (objNode.nodeValue.length > 0))
objRoot.TextValue = objNode.nodeValue;
// agregar atributos
if(objNode.attributes) {
var Attribute;
var oNodeList = objNode.attributes;
for(var i = 0;i < oNodeList.length; i++) {
Attribute = oNodeList.item(i);
var newNode;
newNode = ProcessDOMNode(Attribute,objCreator);
objRoot.AppendChild(newNode);
}
}
if(objNode.hasChildNodes) {
try {
// agregar secundarios
var Item;
oNodeList = objNode.childNodes;
for(var i = 0;i < oNodeList.length; i++) {
Item = oNodeList.item(i);
var newNode;
newNode = ProcessDOMNode(Item,objCreator);
objRoot.AppendChild(newNode);
}
}
catch(err) {
}
}
}
return objRoot;
}
function CreateXMLDataFromDOMNode(objNode,objCreator)
{
var bSetName = true;
var bSetValue = true;
var nKind = 4;
switch(objNode.nodeType) {
case 2:nKind = 5;break;
case 3:nKind = 6;bSetName = false;break;
case 4:nKind = 7;bSetName = false;break;
case 8:nKind = 8;bSetName = false;break;
case 7:nKind = 9;break;
}
var objNew = null;
objNew = objCreator.CreateChild(nKind);
if(bSetName)
objNew.Name = objNode.nodeName;
if(bSetValue && (objNode.nodeValue != null))
objNew.TextValue = objNode.nodeValue;
return objNew;
}
Conversión de XMLData en DOM
El siguiente código muestra cómo convertir segmentos XMLData en DOM.
////////////////////////////////////////////////////////////////
// conversión de segmentos XMLData en DOM
function ProcessXMLDataNode(objXMLData,xmlDoc)
{
var objRoot;
objRoot = CreateDOMNodeFromXMLData(objXMLData,xmlDoc);
if(objRoot) {
if(IsTextNodeEnabled(objRoot) && (objXMLData.TextValue.length > 0))
objRoot.appendChild(xmlDoc.createTextNode(objXMLData.TextValue));
if(objXMLData.HasChildren) {
try {
var objChild;
objChild = objXMLData.GetFirstChild(-1);
while(true) {
if(objChild) {
var newNode;
newNode = ProcessXMLDataNode(objChild,xmlDoc);
if(newNode.nodeType == 2) {
// el nodo secundario es un atributo
objRoot.attributes.setNamedItem(newNode);
}
else
objRoot.appendChild(newNode);
}
objChild = objXMLData.GetNextChild();
}
}
catch(err) {
}
}
}
return objRoot;
}
function CreateDOMNodeFromXMLData(objXMLData,xmlDoc)
{
switch(objXMLData.Kind) {
case 4:return xmlDoc.createElement(objXMLData.Name);
case 5:return xmlDoc.createAttribute(objXMLData.Name);
case 6:return xmlDoc.createTextNode(objXMLData.TextValue);
case 7:return xmlDoc.createCDATASection(objXMLData.TextValue);
case 8:return xmlDoc.createComment(objXMLData.TextValue);
case 9:return xmlDoc.createProcessingInstruction(objXMLData.Name,objXMLData.TextValue);
}
return xmlDoc.createElement(objXMLData.Name);
}
function IsTextNodeEnabled(objNode)
{
switch(objNode.nodeType) {
case 1:
case 2:
case 5:
case 6:
case 11:return true;
}
return false;
}