Heim  >  Artikel  >  Backend-Entwicklung  >  Instanzmethode der Klasse TransformBinder, die XML in XML analysiert

Instanzmethode der Klasse TransformBinder, die XML in XML analysiert

Y2J
Y2JOriginal
2017-04-22 14:20:341482Durchsuche

In den letzten Tagen habe ich xslt studiert, um XML in xhtml zu konvertieren. Der vorherige Artikel hat die Verwendung von xslt zum Parsen von XML in xhtml vorgestellt.

Aufgrund der vorherigen Methode muss xslt sein Direkt in die XML-Datei importiert und im Projekt Die verwendete XML-Datei wird vom System generiert und kann nur den Pfad bereitstellen, es gibt jedoch keine Möglichkeit, den Inhalt in der XML neu zu schreiben. Daher müssen wir eine Möglichkeit finden, ihn zuzuordnen xml und xslt extern Dies erfüllt nicht nur den Zweck, sondern kann zur einfachen Verwaltung auch auf mehrere XML-Dateien angewendet werden.
Beginnen wir mit dem Modul js, das speziell zum Verpacken von js verwendet wird. Ich werde es jetzt nur verwenden und habe es nicht studiert seine zugrunde liegenden Funktionen. Hier schreiben wir js in eine Datei, einschließlich der von Klassen implementierten Klassen und Methoden:

Der Code ist wie folgt:

var XmlDom=function(){
 if (window.ActiveXObject) {
  // IE
 var arrSignatures = ["MSXML2.DOMDocument.5.0", "MSXML2.DOMDocument.4.0", "MSXML2.DOMDocument.3.0", "MSXML2.DOMDocument", "Microsoft.XmlDom"];
 for (var i=0; i < arrSignatures.length; i++)
 {
  try { var oXmlDom = new ActiveXObject(arrSignatures[i]); return oXmlDom;
 }
 catch (oError)
  {
 //ignore
 }
 }
 throw new Error("你的系统没有安装 MSXML.");
  }
   else if(document.implementation.createDocument){
 // Firefox
 var oXmlDom = document.implementation.createDocument("", "", null); return oXmlDom;
 }
 else{ throw new Error("浏览器不支持 XML DOM object.");
 }
 }
  var transformXSLT=function(_XML,_XSL)
   {
    if (window.Node)
     {
      Node.prototype.transformNode = function(XslDom)
       {
        var oProcessor = new XSLTProcessor();
         oProcessor.importStylesheet(XslDom);
        var oResultDom = oProcessor.transformToDocument(myXmlDom);
        var oSerializer = new XMLSerializer();
        var sXml = oSerializer.serializeToString(oResultDom, "text/xml");
        return sXml;
        }
       }
   var myXmlDom = new XmlDom();
   myXmlDom.async=false;
   var myXslDom = new XmlDom();
   myXslDom.async=false;
   myXmlDom.load(_XML);
   myXslDom.load(_XSL);
   var sResult=myXmlDom.transformNode(myXslDom);
   if(window.ActiveXObject){
    if(myXmlDom.parseError.errorCode != 0){
     var sError=myXmlDom.parseError;
     var txt = ""; txt += "<br>错误代码: "; txt += sError.errorCode;
     txt += "<br>错误原因: ";
     txt += sError.reason; txt += "<br>错误行号: ";
     txt += sError.line; document.write(txt);
      }else{
       document.write(sResult);
        }
       }else if(document.implementation.createDocument){
        var oSerializer = new XMLSerializer();
        var sXmlDom = oSerializer.serializeToString(myXmlDom, "text/xml");
        var oParser = new DOMParser(); var oXmlDom = oParser.parseFromString(sXmlDom,"text/xml");
        if (oXmlDom.documentElement.tagName == "parsererror")
         { var oXmlSerializer = new XMLSerializer();
          var sXmlError = oXmlSerializer.serializeToString(oXmlDom); alert(sXmlError);
           } else { document.write(sResult);
            }
           }
          } var TransformBinder = function(XML,XSL) { this.XML = XML; this.XSL = XSL; } TransformBinder.prototype.registerAction = function(handlers) { this.handlers = handlers; } TransformBinder.prototype.bind = function() { var _this = this; this.handlers(_this.XML,_this.XSL); }

Das Folgende ist der HTML-Code: Der xmlDom-Konstruktor wird verwendet, um das Dom-Element von XML zu erstellen
Für IE und FF die Methoden zum Erstellen dom ist unterschiedlich. IE verwendet die window.ActiveXObject-Methode, um es zu erstellen, während FF die document-Methode verwendet, um es zu erstellen. Wir verwenden diese beiden Attribute, um zu bestimmen, ob es sich um IE oder FF handelt.

Für verschiedene Versionen von XML ["MSXML2.DOMDocument.5.0", "MSXML2.DOMDocument.4.0", "MSXML2.DOMDocument.3.0", "MSXML2.DOMDocument", "Microsoft.XmlDom"] unter IE verwenden Sie for Durchlaufen Sie die entsprechende Version und verwenden Sie dann new ActiveXObject(arrSignatures[i]), um den Dom zu erstellen.

Verwenden Sie document.implementation.createDocument("", "", null); unter FF, um den Dom direkt zu erstellen.

Wenn Sie durchsuchen, dass der Server kein XML-DOM-Objekt unterstützt, wird ein Fehler ausgegeben.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<script type=&#39;text/javascript&#39; src="transform.js"></script> 
</head> 
<body> 
<script type="text/javascript"> 
var XML = "这里输入XML路径"; 
var XSL = "这里输入XSL路径"; 
var tempObj = new TransformBinder(XML,XSL); 
tempObj.registerAction(transformXSLT); 
tempObj.bind(); 
</script> 
</body> 
</html>
Der transformXSLT-Konstruktor verwendet XSLT, um XML in HTML zu konvertieren. Unter FF gibt es keine transformNode-Methode, daher haben wir selbst eine Methode erstellt

Der Code lautet wie folgt:
Dann verwenden Sie diese Methode, um die Konvertierung zu implementieren. IE ist relativ einfach. Es gibt ein parseError-Attribut zum Laden von Fehlerinformationen, und der Grund ist der Fehler Zeile ist die falsche Nummer und einige andere Informationen. Hier müssen Sie nur die Hauptfehlermeldung anzeigen. Wenn ein Fehler auftritt, wird das Konvertierungsergebnis angezeigt. Unter FF ist es etwas komplizierter. Verwenden Sie XMLSerializer und XMLSerializeToString(), um xmlDom in einen String zu konvertieren, und konvertieren Sie den String dann in ein Dom-Objekt. Wenn während des Konvertierungsvorgangs ein Fehler gemeldet wird, können Sie die Informationen abrufen, die Parsererror enthalten , und beurteilen Sie es. Ist der TagName der Zeichenfolge ein Parserfehler? Wenn ja, konvertieren Sie das Dom-Objekt in eine Zeichenfolge und werfen Sie den Inhalt in die Zeichenfolge. Wenn nicht, zeigen Sie das Konvertierungsergebnis an.
Hier sind einige Punkte zu beachten:
a. IE kann DTD-Fehler in XML erkennen, während FF nur Grammatikfehler in XML selbst erkennen kann;
b Das Endergebnis ist schwer zusammenzuführen und die Codestruktur sieht möglicherweise nicht vernünftig aus, was ebenfalls ein hilfloser Schachzug ist.

Verwenden Sie die TransformBinder-Klasse, um sie für eine einfache Erweiterung und Änderung zu kapseln.

Der TransformBinder.prototype.registerAction-Prototyp wird zum Registrieren von Ereignissen verwendet und verwendet dann TransformBinder.prototype.bind, um die Ereignisse zu binden. Wenn Sie diese Klasse verwenden müssen, müssen Sie nur den neuen TransformBinder (XML, XSL) registrieren transformXSLT-Ereignis und dann an binden, um diesen Effekt zu erzielen. Wenn Sie es erweitern müssen, erstellen Sie einen neuen Konstruktor, registrieren Sie ihn und binden Sie ihn an diese Klasse, um den Effekt zu erzielen.

Das obige ist der detaillierte Inhalt vonInstanzmethode der Klasse TransformBinder, die XML in XML analysiert. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn