DOM und XML Data
Über die XMLDataSchnittstelle haben Sie Zugriff auf die gesamte XML-Struktur, die dem aktuellen Dokument zugrunde liegt. Sie benötigen dafür weniger Methoden als DOM und der Zugriff ist einfacher. Die XMLDataSchnittstelle ist eine möglichst einfache Methode, um vorhandene oder neu erstellte XML-Daten zu lesen und zu bearbeiten. Eventuell sollten Sie jedoch eine DOM-Struktur verwenden, weil Sie auf diese von einer externen Quelle aus zugreifen können oder weil Sie die MSXML DOM-Implementierung vorziehen.
Die unten gezeigten Funktionen ProcessDOMNode()und ProcessXMLDataNode() konvertieren alle Segmente einer XML-Struktur zwischen XMLDataund DOM.
Um die ProcessDOMNode() Funktion zu verwenden:
•übergeben Sie das Root-Element des zu konvertierenden DOM-Segments in objNode und
•übergeben Sie das Plugin-Objekt mit der CreateChild() Methode in objCreator
Um die ProcessXMLDataNode() Funktion zu verwenden:
•übergeben Sie das Root-Element des XMLData-Segments in objXMLData und
•übergeben Sie das mit MSXML in xmlDoc erstellte DOMDocument
////////////////////////////////////////////////////////////////
// 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 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;
}