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>

等...

これを .Net アプリケーションで処理される新しい XML に変換する XSLT スクリプトを開発しました。

問題は、このアプリケーションをオフラインで動作させたいということです。つまり、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