web-dev-qa-db-fra.com

Incorporation de XML (avec déclaration XML) dans HTML ou autre XML

J'ai l'erreur:

Erreur d'analyse /WEB-INF/includes/VerDatosProyeccion.xhtml: erreur tracée [ligne: 4302] La cible de l'instruction de traitement correspondant à "[xX] [mM] [lL]" n'est pas autorisée.

J'utilise le code du même code de: http://jsfiddle.net/qxLn3h86/ . J'ai coupé le code et passé dans mon code.

Mon code ressemble à ceci:

        <table id="tbl1">


<tr>
    <td>Name</td>
    <td>Birthday</td>
    <td>Amount</td>
    <td>Rebate (10%)</td>
  </tr>
  <tr>
    <td>Smith</td>
    <td data-type="DateTime" data-style="Date" data-value="1980-03-23">Mar 23 1980</td>
    <td data-type="Number" data-style="Currency" data-value="1234.56">$ 1,234.56</td>
    <td data-formula="=RC[-1]/10" data-type="Number" data-style="Currency">$ 123.45</td>
  </tr>
  <tr>
    <td>Doe</td>
    <td data-type="DateTime" data-style="Date" data-value="1978-11-05">Nov 05 1978</td>
    <td data-type="Number" data-style="Currency" data-value="2345.67">$ 2,345.67</td>
    <td data-formula="=RC[-1]/10" data-type="Number" data-style="Currency">$ 234.56</td>
  </tr>
</table>

<table id="tbl2">
  <tr>
    <td>Product</td>
    <td>Price</td>
    <td>Available</td>
    <td>Count</td>
  </tr>
  <tr>
    <td>Bred</td>
    <td data-type="Number" data-style="Currency" data-value="1.89">$ 1.89</td>
    <td data-type="Boolean" data-value="1">yes</td>
    <td data-type="Number" data-value="123">123</td>
  </tr>
  <tr>
    <td>Butter</td>
    <td data-type="Number" data-style="Currency" data-value=".89">$ .89</td>
    <td data-type="Boolean" data-value="0">no</td>
    <td data-type="Number" data-value="0">0</td>
  </tr>
</table>


            <button  onclick="tablesToExcel(['tbl1','tbl2'], ['Customers','Products'], 'TestBook.xls', 'Excel')">Export to Excel</button>

</h:panelGroup>


<script>
    function exportarExcel(){
        $("#tableProyeccion").table2Excel({
            exclude: ".excludeThisClass",
            name: "Worksheet Name",
            filename: "Proyeccion" //do not include extension
        });
    }
    </script>
<script>
    var tablesToExcel = (function() {
        var uri = 'data:application/vnd.ms-Excel;base64,'
        , tmplWorkbookXML ='<?xml version="1.0"?><?mso-application progid="Excel.Sheet"?><Workbook xmlns="urn:schemas-Microsoft-com:office:spreadsheet" xmlns:ss="urn:schemas-Microsoft-com:office:spreadsheet">'
          + '<DocumentProperties xmlns="urn:schemas-Microsoft-com:office:office"><Author>Axel Richter</Author><Created>{created}</Created></DocumentProperties>'
          + '<Styles>'
          + '<Style ss:ID="Currency"><NumberFormat ss:Format="Currency"></NumberFormat></Style>'
          + '<Style ss:ID="Date"><NumberFormat ss:Format="Medium Date"></NumberFormat></Style>'
          + '</Styles>' 
          + '{worksheets}</Workbook>'
        , tmplWorksheetXML = '<Worksheet ss:Name="{nameWS}"><Table>{rows}</Table></Worksheet>'
        , tmplCellXML = '<Cell{attributeStyleID}{attributeFormula}><Data ss:Type="{nameType}">{data}</Data></Cell>'
        , base64 = function(s) { return window.btoa(unescape(encodeURIComponent(s))) }
        , format = function(s, c) { return s.replace(/{(\w+)}/g, function(m, p) { return c[p]; }) }
        return function(tables, wsnames, wbname, appname) {
          var ctx = "";
          var workbookXML = "";
          var worksheetsXML = "";
          var rowsXML = "";

          for (var i = 0; i < tables.length; i++) {
            if (!tables[i].nodeType) tables[i] = document.getElementById(tables[i]);
            for (var j = 0; j < tables[i].rows.length; j++) {
              rowsXML += '<Row>'
              for (var k = 0; k < tables[i].rows[j].cells.length; k++) {
                var dataType = tables[i].rows[j].cells[k].getAttribute("data-type");
                var dataStyle = tables[i].rows[j].cells[k].getAttribute("data-style");
                var dataValue = tables[i].rows[j].cells[k].getAttribute("data-value");
                dataValue = (dataValue)?dataValue:tables[i].rows[j].cells[k].innerHTML;
                var dataFormula = tables[i].rows[j].cells[k].getAttribute("data-formula");
                dataFormula = (dataFormula)?dataFormula:(appname=='Calc' && dataType=='DateTime')?dataValue:null;
                ctx = {  attributeStyleID: (dataStyle=='Currency' || dataStyle=='Date')?' ss:StyleID="'+dataStyle+'"':''
                       , nameType: (dataType=='Number' || dataType=='DateTime' || dataType=='Boolean' || dataType=='Error')?dataType:'String'
                       , data: (dataFormula)?'':dataValue
                       , attributeFormula: (dataFormula)?' ss:Formula="'+dataFormula+'"':''
                      };
                rowsXML += format(tmplCellXML, ctx);
              }
              rowsXML += '</Row>'
            }
            ctx = {rows: rowsXML, nameWS: wsnames[i] || 'Sheet' + i};
            worksheetsXML += format(tmplWorksheetXML, ctx);
            rowsXML = "";
          }

          ctx = {created: (new Date()).getTime(), worksheets: worksheetsXML};
          workbookXML = format(tmplWorkbookXML, ctx);

    console.log(workbookXML);

          var link = document.createElement("A");
          link.href = uri + base64(workbookXML);
          link.download = wbname || 'Workbook.xls';
          link.target = '_blank';
          document.body.appendChild(link);
          link.click();
          document.body.removeChild(link);
        }
      })();

</script>
11
user5344710

Réponse générale

Lorsque les déclarations XML (<?xml version="1.0" ?>) apparaissent ailleurs qu'au sommet d'un document XML, les analyseurs les confondent souvent avec les instructions de traitement et émettent des messages d'erreur trompeurs.

Le réponse canonique pour corriger votre erreur,

Erreur tracée [ligne: 4302] La cible de l'instruction de traitement correspondant à "[xX] [mM] [lL]" n'est pas autorisée.

et toutes les erreurs similaires liées aux déclarations XML sont couvertes par ce Q/A:

Vous y trouverez des solutions aux trois causes de telles erreurs:

  1. Contenu visible avant la déclaration XML
  2. Contenu invisible avant la déclaration XML
  3. Déclarations XML en double

Suggestions pour votre cas particulier

Essayer d'encapsuler votre code dans script avec CDATA:

<script>
//<![CDATA[
    ...code containing XML declaration (`<?xml version="1.0"?>`)
//]]>
</script>

afin que la déclaration XML ne soit pas interprétée comme faisant partie du document joint. Les déclarations XML ne peuvent apparaître qu'en haut d'un document XML (et il ne peut y en avoir qu'une au maximum).

Si cela ne résout pas votre problème, examinez où vous produisez la déclaration XML. Assurez-vous qu'il n'y a pas de contenu visible ou invisible avant la déclaration XML et assurez-vous qu'il n'y a pas plusieurs déclarations XML dans la sortie. Pour plus de détails, voir:

16
kjhughes

Cela peut également se produire si vous avez une balise xml en double <?xml version="1.0"...> défini accidentellement

10
Irshu