0

我有一个带有 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

4

0 回答 0