Méthode d'instance de la classe TransformBinder qui analyse XML en XML

Y2J
Libérer: 2017-04-22 14:20:34
original
1470 Les gens l'ont consulté

Ces derniers jours, j'ai étudié xslt pour convertir xml en xhtml. L'article précédent présentait l'utilisation de xslt pour analyser xml en xhtml

En raison de la méthode précédente, xslt doit être. importé directement dans le fichier XML et dans le projet. Le fichier XML utilisé est généré par le système et ne peut fournir que le chemin, mais il n'y a aucun moyen de réécrire le contenu dans le XML. Nous devons donc trouver un moyen de l'associer. xml et xslt en externe Cela permet non seulement d'atteindre l'objectif, mais peut également être appliqué à plusieurs fichiers XML pour une gestion facile.
Commençons par le code. Le module js est utilisé dans le système pour le packaging. L'outil module est spécialement utilisé pour packager js. Je présenterai cet outil dans un prochain article, je ne peux l'utiliser que maintenant et je n'ai pas étudié. ses fonctions sous-jacentes ; ici nous écrivons js dans un fichier, y compris les classes et les méthodes implémentées par les classes
Voici le code js : transform.js

Le code est le suivant :

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); }
Copier après la connexion

Ce qui suit est le code html :
Le constructeur xmlDom est utilisé pour créer l'élément dom de xml

Pour IE et FF, les méthodes de création. dom sont différents. IE utilise la méthode window.ActiveXObject pour le créer, tandis que FF utilise document La méthode Implementation.createDocument est utilisée pour le créer. Nous utilisons ces deux attributs pour déterminer s'il s'agit d'IE ou de FF.

Pour différentes versions de XML ["MSXML2.DOMDocument.5.0", "MSXML2.DOMDocument.4.0", "MSXML2.DOMDocument.3.0", "MSXML2.DOMDocument", "Microsoft.XmlDom"] sous IE, utiliser pour Parcourez pour trouver la version correspondante, puis utilisez new ActiveXObject(arrSignatures[i]) pour créer le dom ;

Utilisez document.implementation.createDocument("", "", null sous FF pour créer directement le dom ;
<!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>
Copier après la connexion
Si vous parcourez Si le serveur ne prend pas en charge l'objet XML DOM, une erreur sera générée.

Le constructeur transformXSLT utilise XSLT pour convertir XML en HTML. Il n'y a pas de méthode transformNode sous FF, nous avons donc construit une méthode nous-mêmes
Le code est le suivant : .
Ensuite, utilisez cette méthode pour implémenter la conversion. IE et FF ont des méthodes de traitement différentes pour gérer les erreurs. IE est relativement simple. Il existe un attribut parseError pour charger les informations d'erreur. La raison est la cause de l'erreur. , et la ligne est le mauvais numéro de ligne, et quelques autres informations. Ici, il vous suffit d'afficher le message d'erreur principal. Si une erreur se produit, le contenu de l'erreur est affiché. S'il n'y a pas d'erreur, le résultat de la conversion sResult est affiché. C'est un peu plus compliqué sous FF. Utilisez XMLSerializer et XMLSerializer.serializeToString() pour convertir xmlDom en chaîne, puis convertissez la chaîne en objet dom si une erreur est signalée pendant le processus de conversion, vous pouvez obtenir les informations contenant parsererror. , et jugez-le. Le tagName de l'analyseur de chaîne est-il une erreur ? Si tel est le cas, convertissez l'objet dom en chaîne et supprimez le contenu de la chaîne. Sinon, affichez le résultat de la conversion sResult.
Il y a quelques points à noter ici :
a. IE peut détecter les erreurs DTD dans XML, tandis que FF ne peut détecter que les erreurs grammaticales dans XML lui-même
b Parce que les erreurs doivent être déterminées dans le navigateur ; , le résultat final est difficile à fusionner et la structure du code peut ne pas sembler raisonnable, ce qui est également un geste impuissant.

Utilisez la classe TransformBinder pour l'encapsuler afin de faciliter l'expansion et la modification.

Le prototype TransformBinder.prototype.registerAction est utilisé pour enregistrer les événements, puis utilisez TransformBinder.prototype.bind pour lier les événements. Lorsque vous devez utiliser cette classe, vous n'avez besoin que d'un nouveau TransformBinder (XML, XSL), enregistrez le. transformXSLT, puis se lier à lier, obtenant ainsi cet effet. Si vous avez besoin de l'étendre, créez un nouveau constructeur, enregistrez-le et liez-le à cette classe pour obtenir l'effet.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!