C# XslCompiledTransform转换调用导致DTD崩溃
在转换xml数据时,我遇到了一些问题。我在.Net framework 4.0上使用XslCompiledTransform对象C# XslCompiledTransform转换调用导致DTD崩溃,c#,xml,xslt,C#,Xml,Xslt,在转换xml数据时,我遇到了一些问题。我在.Net framework 4.0上使用XslCompiledTransform对象 XDocument v_xdoc = XDocument.Load("XLMData.xml"); XslCompiledTransform myXslTrans = new XslCompiledTransform(); myXslTrans.Load("XSLTFile1.xslt", new XsltSettings(true, false), null); X
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);
}
我也有同样的崩溃
这是我的XSLT文件
<?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>
和消息异常:
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文件的好参数。有人有主意了吗?在XSLT中使用文档似乎是导致异常的原因
你可以通过这样的改变来避免这种使用
<?xml version="1.0"?>
<!DOCTYPE xsl:stylesheet [
<!ENTITY nbsp " ">
<!ENTITY euro "€" >
]>
<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>
异常文本似乎已关闭。这不是最初的英语例外,是吗?当你使用DtdProcessing时,你真的得到了完全相同的异常吗?当你有DtdProcessing的默认值时进行解析。禁止你发布的异常文本似乎与此一致?@PeterDuniho该文本是来自法语的传统。但是对于DtdProcessing.banford也有同样的崩溃。好吧,现在我们知道您的XSLT样式表使用文档来读取XSLT本身,这似乎是导致错误的原因。看起来VisualStudio可以运行和调试XML和样式表,而不会导致异常,但我目前不确定如何更改C代码以避免异常。但是,有一些方法可以更改XSLT,以避免使用DOCTYPE简单地创建一些实体,这些实体也可以直接以XML和Unicode字符表示。我还可以建议重写XSLT以避免使用文档。我重写我的答案是为了说明如何避免使用文档。也许这是你的一个选择。你发现马丁的答案有助于解决你的问题,这很好。供将来参考:您发布的文本不是堆栈跟踪。它只是程序的运行时输出;它只告诉我们加载了一堆dll,然后System.Data.SqlXml.dll抛出了XslTransformException。最关键的是,它没有告诉我们您的代码中哪一行被称为SqlXml.dll,也没有告诉我们该dll中调用了什么方法。如果Martin没有猜到实际的问题,那么真正的堆栈跟踪将非常有用。感谢您重新编写示例。Load方法在导致崩溃的调用转换中正常工作。请发布允许任何人重现问题的内容。然后请发布异常的堆栈跟踪,在您的第一篇文章中,您说Load正在引发异常。
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.
<?xml version="1.0"?>
<!DOCTYPE xsl:stylesheet [
<!ENTITY nbsp " ">
<!ENTITY euro "€" >
]>
<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>