我想在转换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 " ">
<!ENTITY euro "€" >
]>
<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文件的好参数。有人有一个想法?
异常文字似乎“关闭”。那不是原来的英语例外,是吗?当你使用'DtdProcessing.Parse'的时候,你确实得到了_exactly_同样的异常,因为当你有默认值'DtdProcessing.Prohibit'时(这是你发布的异常文本似乎是一样的)? – 2014-10-28 07:58:50
@PeterDuniho这段文字是来自法语的翻译。但与DtdProcessing.Prohibit具有相同的崩溃。 – tdelepine 2014-10-28 09:50:21
好,现在我们知道你的XSLT样式表使用'document('')'来读取XSLT本身,并且看起来这会导致错误。它看起来好像Visual Studio可以运行和调试您的XML和样式表而不会导致该异常,但我目前不知道如何更改C#代码以避免该异常。但是有一些方法可以改变XSLT,以避免使用DOCTYPE来简单地创建一些实体,这些实体也可以直接作为XML和Unicode中的字符呈现。我也可以建议重写XSLT以避免使用'document('')'。 – 2014-10-28 11:26:02