2014-10-28 96 views
0

我想在轉換xml數據時遇到一些問題。我在.Net框架4.0上使用XslCompiledTransform對象。XslCompiledTransform轉換調用導致DTD崩潰

XDocument v_xdoc = XDocument.Load("XLMData.xml"); 
XslCompiledTransform myXslTrans = new XslCompiledTransform(); 
myXslTrans.Load("XSLTFile1.xslt", new XsltSettings(true, false), null); 
XPathNavigator nav = v_xdoc.CreateNavigator(); 

using (TextWriter myWriter = File.CreateText("result.scpt")) 
{ 
    myXslTrans.Transform(nav, null, myWriter); 
} 

我有這樣的崩潰:

爲安全起見,在該文件禁止DTD XML。啓用DTD處理設置解析XmlReaderSettings DtdProcessing上的屬性並將參數傳遞給XmlReader.Create方法。

當我改變我的代碼以XmlReaderSettings:

XDocument v_xdoc = XDocument.Load("XLMData.xml"); 

XslCompiledTransform myXslTrans = new XslCompiledTransform(true); 
myXslTrans.Load(
    XmlReader.Create("XSLTFile1.xslt", 
    new XmlReaderSettings() 
    { 
     DtdProcessing = DtdProcessing.Parse 
    }), 
    new XsltSettings(true, false), 
    null 
); 

XPathNavigator nav = v_xdoc.CreateNavigator(); 
using (TextWriter myWriter = File.CreateText("result.scpt")) 
{ 
    myXslTrans.Transform(nav, null, myWriter); 
} 

我有同樣的崩潰。

這是我XsltFile

<?xml version="1.0"?> 

<!DOCTYPE xsl:stylesheet [ 
    <!ENTITY nbsp "&#x00A0;"> 
    <!ENTITY euro "&#8364;" > 
]> 

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:csv="csv:csv" 
       xmlns:n="http://novamap.fr/xml/data/v1" 
       version="1.0"> 

    <xsl:output method="text" encoding="utf-8"/> 

    <xsl:variable name="delimiter" select="';'"/> 

    <csv:columns> 
    <column>BDC_ID_BON_DE_COMMANDE</column> 
    <column>BDC_LI_BON_DE_COMMANDE</column> 
    <column>BDC_REF_BON_DE_COMMANDE</column> 
    <column>BDC_DT_EMISSION_STR</column> 
    </csv:columns> 

    <xsl:template match="/n:XmlModelBonDeCommande"> 

    <xsl:for-each select="document('')/*/csv:columns/*"> 
     <xsl:value-of select="."/> 
     <xsl:if test="position() != last()"> 
     <xsl:value-of select="$delimiter"/> 
     </xsl:if> 
    </xsl:for-each> 

    <xsl:text> 
</xsl:text> 
    <!-- Output rows for each matched property --> 
    <xsl:apply-templates select="n:GMP_BON_DE_COMMANDE"/> 
    </xsl:template> 

</xsl:stylesheet> 

這是我XMLFILE

<XmlModelBonDeCommande xmlns="http://novamap.fr/xml/data/v1"> 
    <GMP_BON_DE_COMMANDE> 
    <BDC_ID_BON_DE_COMMANDE>154</BDC_ID_BON_DE_COMMANDE> 
    <BDC_LI_BON_DE_COMMANDE>BON DE COMMANDE</BDC_LI_BON_DE_COMMANDE> 
    <BDC_REF_BON_DE_COMMANDE>20140624-08</BDC_REF_BON_DE_COMMANDE> 
    <BDC_DT_EMISSION>2014-06-24T02:00:00+02:00</BDC_DT_EMISSION> 
    <BDC_DT_EMISSION_STR>24/06/2014</BDC_DT_EMISSION_STR> 
    <BDC_MT_MONTANT_HT>132.38</BDC_MT_MONTANT_HT> 
    <BDC_MT_MONTANT_HT_STR>132,38</BDC_MT_MONTANT_HT_STR> 
    <BDC_MT_MONTANT_TVA>9.27</BDC_MT_MONTANT_TVA> 
    <BDC_MT_MONTANT_TVA_STR>9,27</BDC_MT_MONTANT_TVA_STR> 
    <BDC_MT_MONTANT_TTC>141.65</BDC_MT_MONTANT_TTC> 
    <BDC_MT_MONTANT_TTC_STR>141,65</BDC_MT_MONTANT_TTC_STR> 
    </GMP_BON_DE_COMMANDE> 
</XmlModelBonDeCommande> 

執行跟蹤:

'WindowsFormsApplication4.vshost.exe' (Managé (v4.0.30319)) : 'c:\users\dell\documents\visual studio 2012\Projects\WindowsFormsApplication4\WindowsFormsApplication4\bin\Debug\WindowsFormsApplication4.exe' chargé, symboles chargés. 
'WindowsFormsApplication4.vshost.exe' (Managé (v4.0.30319)) : 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Data.SqlXml\v4.0_4.0.0.0__b77a5c561934e089\System.Data.SqlXml.dll' chargé, chargement des symboles ignoré. Le module est optimisé et l'option du débogueur 'Uniquement mon code' est activée. 
'WindowsFormsApplication4.vshost.exe' (Managé (v4.0.30319)) : 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Configuration\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Configuration.dll' chargé, chargement des symboles ignoré. Le module est optimisé et l'option du débogueur 'Uniquement mon code' est activée. 
'WindowsFormsApplication4.vshost.exe' (Managé (v4.0.30319)) : 'System.Xml.Xsl.CompiledQuery.1' chargé 
'WindowsFormsApplication4.vshost.exe' (Managé (v4.0.30319)) : 'System.Xml.Xsl.CompiledQuery.2' chargé 
'WindowsFormsApplication4.vshost.exe' (Managé (v4.0.30319)) : 'C:\Windows\Microsoft.Net\assembly\GAC_32\ISymWrapper\v4.0_4.0.0.0__b03f5f7f11d50a3a\ISymWrapper.dll' chargé 
'WindowsFormsApplication4.vshost.exe' (Managé (v4.0.30319)) : 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Xml.resources\v4.0_4.0.0.0_fr_b77a5c561934e089\System.Xml.resources.dll' chargé 
'WindowsFormsApplication4.vshost.exe' (Managé (v4.0.30319)) : 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Data.SqlXml.resources\v4.0_4.0.0.0_fr_b77a5c561934e089\System.Data.SqlXml.resources.dll' chargé 
Une exception de première chance de type 'System.Xml.Xsl.XslTransformException' s'est produite dans System.Data.SqlXml.dll 

和消息異常:

Pour des raisons de sécurité, DTD interdite dans ce document XML. Pour activer le traitement DTD, définissez sur Parse la propriété DtdProcessing sur XmlReaderSettings et transmettez les paramètres à la méthode XmlReader.Create. 

當我刪除DOCTYPE它工作正常,但我需要它。我找不到加載我的xslt文件的好參數。有人有一個想法?

+0

異常文字似乎「關閉」。那不是原來的英語例外,是嗎?當你使用'DtdProcessing.Parse'的時候,你確實得到了_exactly_同樣的異常,因爲當你有默認值'DtdProcessing.Prohibit'時(這是你發佈的異常文本似乎是一樣的)? – 2014-10-28 07:58:50

+0

@PeterDuniho這段文字是來自法語的翻譯。但與DtdProcessing.Prohibit具有相同的崩潰。 – tdelepine 2014-10-28 09:50:21

+0

好,現在我們知道你的XSLT樣式表使用'document('')'來讀取XSLT本身,並且看起來這會導致錯誤。它看起來好像Visual Studio可以運行和調試您的XML和樣式表而不會導致該異常,但我目前不知道如何更改C#代碼以避免該異常。但是有一些方法可以改變XSLT,以避免使用DOCTYPE來簡單地創建一些實體,這些實體也可以直接作爲XML和Unicode中的字符呈現。我也可以建議重寫XSLT以避免使用'document('')'。 – 2014-10-28 11:26:02

回答

0

看來在您的XSLT中使用document('')會導致異常。

你可能避免與更改使用像

<?xml version="1.0"?> 

<!DOCTYPE xsl:stylesheet [ 
    <!ENTITY nbsp "&#x00A0;"> 
    <!ENTITY euro "&#8364;" > 
]> 

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:exsl="http://exslt.org/common" 
       xmlns:csv="csv:csv" 
       xmlns:n="http://novamap.fr/xml/data/v1" 
       version="1.0"> 

    <xsl:output method="text" encoding="utf-8"/> 

    <xsl:variable name="delimiter" select="';'"/> 

    <xsl:variable name="columns"> 
    <csv:columns> 
    <column>BDC_ID_BON_DE_COMMANDE</column> 
    <column>BDC_LI_BON_DE_COMMANDE</column> 
    <column>BDC_REF_BON_DE_COMMANDE</column> 
    <column>BDC_DT_EMISSION_STR</column> 
    </csv:columns> 
    </xsl:variable> 

    <xsl:template match="/n:XmlModelBonDeCommande"> 

    <xsl:for-each select="exsl:node-set($columns)/csv:columns/*"> 
     <xsl:value-of select="."/> 
     <xsl:if test="position() != last()"> 
     <xsl:value-of select="$delimiter"/> 
     </xsl:if> 
    </xsl:for-each> 

    <xsl:text> 
</xsl:text> 
    <!-- Output rows for each matched property --> 
    <xsl:apply-templates select="n:GMP_BON_DE_COMMANDE"/> 
    </xsl:template> 

</xsl:stylesheet> 
+0

謝謝你重寫一個例子。 Load方法正常工作的是調用Transform導致崩潰。 – tdelepine 2014-10-28 09:53:40

+0

請張貼允許任何人重現問題的內容。 – 2014-10-28 09:56:56

+0

然後請發佈異常的堆棧跟蹤,在您的第一篇文章中您說Load正在拋出異常。 – 2014-10-28 10:10:43