我有一个带有 Web DTD 的第三方 XML,如下所示:
<?xml version="1.0"?>
<!DOCTYPE orders
SYSTEM "http://www.mijnwinkel.nl/DTD/orders_export_v2.dtd">
<orders>
<mail version="2.0" >
<set id="session" sequence="1" version="1.1" >
<property id="calc_vat"
label=""
sequence="0"
resource_label=""
show_type=""
name="" >1</property>
<property id="emailvendor"
label=""
sequence=""
resource_label=""
show_type=""
name=""> ... </property>
ETC...
我开发了一个 XSLT 脚本来将其转换为在 .Net 应用程序中处理的新 XML。
问题是我希望这个应用程序脱机工作,这意味着 XSLT 应该忽略外部 DTD 并在代码中使用它的本地副本。
所以,我的代码如下所示:
foreach (var file in fileslist)
{
Message.SendMessage( "Transformeer: "+ file + "....start" );
CurrentFile = Path.GetFileName(file);
//Transforming XML using XSL
var resolver = new XmlUrlResolver
{
Credentials = System.Net.CredentialCache.DefaultCredentials
};
// xml content reader
var settings = new XmlReaderSettings
{
XmlResolver = resolver,
DtdProcessing = System.Xml.DtdProcessing.Parse
};
var xslCompiledTransform = new XslCompiledTransform();
using (Stream strm = Assembly.GetExecutingAssembly().GetManifestResourceStream("EAOrderImportBL.Import.xsl"))
using (XmlReader xslreader = XmlReader.Create(strm))
{
xslCompiledTransform.Load(xslreader, XsltSettings.Default, resolver);
}
var xmlSettings = new XmlWriterSettings();
var reader = XmlReader.Create(file, settings);
using (var w = XmlWriter.Create(TempPath + @"\" + CurrentFile, xmlSettings))
{
xslCompiledTransform.Transform(reader, w);
}
reader.Close();
Message.SendMessage( "Transformatie: " + file + "....complete" );
}
}
由于到 DTD 的外部链接,这工作正常,这是长时间处理的一个方面。
因此,当离线代码行时:
xslCompiledTransform.Transform(reader, w);
抛出有关无法连接/查找外部 DTD 的异常。
谁能解释如何更改代码,以便 xslCompiledTransform.Transform 方法行只检查 Web DTD 的副本?
非常感谢,Jahwik