DOM und XMLData
Die XMLData-Schnittstelle bietet im Vergleich zu DOM weniger Methoden, ist um einiges einfacher und gibt Ihnen vollen Zugriff auf die XML-Struktur des aktuellen Dokuments. Die XMLData-Schnittstelle ist ein minimalistischer Lösungsansatz zum Lesen und Ändern bestehender oder neu erstellter XML-Daten. Sie können aber auch eine DOM-Struktur verwenden, wenn Sie von einer externen Quelle darauf zugreifen können oder die MSXML DOM-Implementierung bevorzugen.
Die nachfolgend beschriebenen Funktionen ProcessDOMNode() und ProcessXMLDataNode() konvertieren alle Segmente einer XML-Struktur zwischen XMLData und DOM.
So verwenden Sie die ProcessDOMNode()-Funktion:
•Übergeben Sie das Root-Element des DOM-Segments, das Sie in objNode konvertieren möchten und
•Übergeben Sie das Plug-In-Objekt mit der CreateChild()-Methode in objCreator.
So verwenden Sie die ProcessXMLDataNode()-Funktion:
•Übergeben Sie das Root-Element des XMLData-Segments in objXMLData und
•Übergeben Sie das mit MSXML in xmlDoc erzeugte DOMDocument-Objekt.
DOM in XMLData
Im nachstehenden Code wird gezeigt, wie Sie DOM in XMLData konvertieren.
////////////////////////////////////////////////////////////////
// DOM to XMLData conversion
function ProcessDOMNode(objNode,objCreator)
{
var objRoot;
objRoot = CreateXMLDataFromDOMNode(objNode,objCreator);
if(objRoot) {
if((objNode.nodeValue != null) && (objNode.nodeValue.length > 0))
objRoot.TextValue = objNode.nodeValue;
// add attributes
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 {
// add children
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;
}
XMLData in DOM
Im nachstehenden Code wird gezeigt, wie Sie XMLData in DOM konvertieren.
////////////////////////////////////////////////////////////////
// XMLData to DOM conversion
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) {
// child node is an attribute
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;
}