>백엔드 개발 >XML/RSS 튜토리얼 >xml을 xhtml로 구문 분석하는 TransformBinder 클래스의 인스턴스 메서드

xml을 xhtml로 구문 분석하는 TransformBinder 클래스의 인스턴스 메서드

Y2J
Y2J원래의
2017-04-22 14:20:341516검색

지난 며칠 동안 xml을 xhtml로 변환하기 위해 xslt를 연구했습니다. 이전 기사에서는 xml을 xhtml로 구문 분석하기 위해 xslt를 사용하는 방법을 소개했습니다.

이전 방법으로 인해 xslt가 필요합니다. xml 파일 내부 및 프로젝트에서 직접 가져옵니다. 사용되는 xml 파일은 시스템에서 생성되며 경로만 제공할 수 있지만 xml의 내용을 다시 작성할 수 있는 방법이 없으므로 연결 방법을 찾아야 합니다. xml 및 xslt를 외부적으로 사용하면 목적을 달성할 수 있을 뿐만 아니라 관리하기 쉽도록 여러 xml 파일에도 적용할 수 있습니다.
코드부터 시작하겠습니다. 모듈 도구는 js를 패키지하는 데 사용됩니다. 이 도구는 지금만 사용할 수 있으며 연구하지 않았습니다. 기본 기능입니다. 여기서는 클래스에 의해 구현된 클래스와 메서드를 포함하여 js를 파일에 작성합니다.
다음은 js 코드입니다.

코드는 다음과 같습니다.

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); }

다음은 html 코드입니다. 🎜>xml의 dom 요소를 생성하는 데에는 xmlDom의 생성자가 사용됩니다. IE와 FF의 경우 dom을 생성하는 방법이 다릅니다. window.ActiveXObject 메서드를 사용하여 생성하는 반면 FF는 document.implementation.createDocument 메서드를 사용하여 생성하며 이 두 속성을 사용하여 IE인지 FF인지 확인합니다.
IE에서 다양한 버전의 xml ["MSXML2.DOMDocument.5.0", "MSXML2.DOMDocument.4.0", "MSXML2.DOMDocument.3.0", "MSXML2.DOMDocument", "Microsoft.XmlDom"]의 경우 다음을 사용하세요. 반복하여 해당 버전을 찾은 다음 new ActiveXObject(arrSignatures[i])를 사용하여 dom을 만듭니다.

FF에서 document.implementation.createDocument("", "", null)를 사용하여 dom을 직접 만듭니다.

탐색하는 경우 서버가 XML DOM 개체를 지원하지 않으면 오류가 발생합니다.

transformXSLT 생성자는 XSLT를 사용하여 xml을 html로 변환합니다. FF에는 변환Node 메서드가 없으므로 우리가 직접 메서드를 구성했습니다.

<!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>
그런 다음 이 방법을 사용하여 변환합니다. IE와 FF는 오류를 처리하는 방법이 다릅니다. IE는 오류 정보를 로드하는 parError 속성이 있으며 오류 코드는 오류의 원인입니다. 는 오류 줄 번호입니다. 여기에는 기본 오류 메시지만 표시하면 됩니다. 오류가 발생하면 오류 내용이 표시됩니다. FF에서는 좀 더 복잡합니다. XMLSerializer 및 XMLSerializer.serializeToString()을 사용하여 xmlDom을 문자열로 변환한 다음 해당 문자열을 dom 객체로 변환하면 변환 과정에서 오류가 보고되면 parsererror가 포함된 정보를 얻을 수 있습니다. , 문자열의 tagName이 파서 오류인지 판단할 수 있습니다. 그렇다면 dom 객체를 문자열로 변환하고 문자열에 포함된 내용을 버립니다. 그렇지 않으면 변환 결과 sResult를 표시합니다. 여기서 몇 가지 주의할 점이 있습니다.
a. IE는 XML에서 DTD 오류를 감지할 수 있지만 FF는 XML 자체의 문법 오류만 감지할 수 있습니다. b. , 최종 결과를 병합하기 어렵고 코드 구조가 합리적으로 보이지 않을 수도 있으며 이는 무기력한 조치이기도 합니다.
쉽게 확장하고 수정할 수 있도록 TransformBinder 클래스를 사용하여 캡슐화합니다.
프로토타입 TransformBinder.prototype.registerAction은 이벤트를 등록하는 데 사용되며, TransformBinder.prototype.bind를 사용하여 이벤트를 바인딩해야 하는 경우 새 TransformBinder(XML,XSL)만 필요합니다. 변환XSLT 이벤트를 수행한 다음 바인딩하여 이 효과를 얻습니다. 확장해야 하는 경우 새 생성자를 만들고 등록한 후 이 클래스에 바인딩하면 효과를 얻을 수 있습니다.

위 내용은 xml을 xhtml로 구문 분석하는 TransformBinder 클래스의 인스턴스 메서드의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.