2017-11-04 4 views
0

C#のXMLWriterによって一連の設定が書き出されています。ここにいくつかのコードがあります:XMLWriterによって現在の項目が書き込まれる方法

 try 
     { 
      XmlWriterSettings settings = new XmlWriterSettings(); 
      settings.Indent = true; 
      settings.IndentChars = (" "); 
      using (writer = XmlWriter.Create("PCOB2NET.XML", settings)) 
      { 
       // Write XML data. 
       writer.WriteStartElement("PowerCOBOL2NETMigration"); 
       writer.WriteStartElement("config"); 
       writer.WriteElementString("VSVersion", selectedVSver); 
       writer.WriteElementString("path2SelectedVSVerProjects", path2SelectedVSVerProjects); 
       if (path2VSoverridden) 
        writer.WriteElementString("path2VSoverridden", "true"); 
       else 
        writer.WriteElementString("path2VSoverridden", "false"); 
       writer.WriteElementString("path2PRCfile", path2PRCfile); 
       writer.WriteElementString("path2XMLfile", path2XMLfile); 
       writer.WriteElementString("path2VSProject", path2VSProject); 

...などです。 私の問題は、例外(例えばnullフィールドのような)がある場合、catchブロックに行き、予期したように例外を報告しますが、その時点で書き込みしていたフィールドはわかりません。

私の質問:

は例外が発生したとき、私は現在の文字列を取得することができますどのような方法が書かれてありますか?私は成功していないWebを検索し、私はXMLWriterのすべてのプロパティとメソッドを見渡しましたが、私はそれを行う方法を見つけることができません。私にそれを与える特定のタイプの例外トラップがありますか?どのような助けや考えがありがとう。

答えて

0

読書のための新しいネットライブラリで試したXML LINQとxml

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml; 
using System.Xml.Linq; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     const string FILENAME = @"c:\temp\test.xml"; 
     static void Main(string[] args) 
     { 
      string selectedVSver = ""; 
      string path2SelectedVSVerProjects = ""; 
      Boolean path2VSoverridden = true; 
      string path2PRCfile = ""; 
      string path2XMLfile = ""; 
      string path2VSProject = ""; 

      XDocument doc = new XDocument(); 

      XElement powerCOBOL2NETMigration = new XElement("PowerCOBOL2NETMigration", new object[] { 
       new XElement("config", new object[] { 
        new XElement("VSVersion", selectedVSver), 
        new XElement("path2SelectedVSVerProjects", path2SelectedVSVerProjects), 
        new XElement("path2VSoverridden", path2VSoverridden), 
        new XElement("path2PRCfile", path2PRCfile), 
        new XElement("path2XMLfile", path2XMLfile), 
        new XElement("path2VSProject", path2VSProject) 
       }) 
      }); 
      doc.Add(powerCOBOL2NETMigration); 

      doc.Save(FILENAME); 
     } 
    } 
} 
+0

私はLINQのファンですので、投稿したコードを見ることに興味がありました。ありがとう。しかし、私は実際の問題にどのように対処しているのか分かりません。私は確かに設定をXMLファイルにブロックとして追加することはできますが、(nullフィールドのような)エラーがあっても、それは私に不適切な形式のXMLを与える可能性があり、問題の原因となったフィールドはまだ分かりません。私が問題なくファイルを書き込むことができたとしても、それを読んで何とか処理しなければならないので、問題を動かすと思う。例外がスローされるべきであることは間違いありません。私の問題は、それが原因でフィールドがスローされることを知ることです。 – Morepork

+0

ヌル例外はありません。これは、アプリケーションがリリースされる前に修正する必要があるプログラミングエラーです。XmlWriterの使用は推奨されていません。開いているタグと終了タグのバランスを適切に調整する必要があります。終了タグは自動的に処理されます。 – jdweng

+0

はい、そうです。フィールドにx00文字が含まれていたため、フィールドがnullだったためではなく、エラーが発生しました。私はnullフィールドを試して、彼らは正常に働いた。 – Morepork

0

を書く最も簡単な方法は、などXmlWriter.WriteStartElement周りの小さなヘルパーメソッドをラップし、そこにあなたの例外をキャッチすることです。

+0

はい、私はそれについて考えました。また、XMLWriterに提示する前に、すべてのフィールドでnullをチェックすることも検討しました。残念ながら、約200フィールドがある場合、どちらも魅力的な選択肢ではありません...あなたの応答に感謝します。 – Morepork

0

私は問題の間違ったところで解決策を探していました。 XMLWriterを困惑させるのではなく、私がEXCEPTIONを調べるべきだったことがあります。 (私はこれをやったのが、唯一の例外クラスのために、私はさらに見てする必要がありました。)それは簡単にいくつかの例外のcatchブロックを入れ子にすることによって解決することができように、問題はそう、見えた:

 catch (ArgumentNullException anEx) 
     { 
      // retrieve the offending field name from anEX... 
      badField = anEx.ParamName; 

... }

 catch (ArgumentException aEx) 
     { 
      // retrieve the offending field name from aEX... 
      badField = aEx.ParamName; 

... }

 catch (Exception ex) 
     { 

...

しかし、私は "ParamName"に惑わされました。それは私が思ったことを意味するものではありません...これはいつもnullを返しました。

C#で例外処理に関するすべてのことを読むのに何時間も費やした後、私ははるかに詳しく知っていますが、賢明ではありません。私はフレームワークのソリューションを見つけることができませんので、私はほとんど頼りになりませんが、実際の書き込みを行い、その時点で例外をトラップするメソッドを通してすべての設定をプッシュすることができます。その方法。

私はこの優雅ではないと思うが、それ以上の時間を費やすことはできない。回答したすべての人と、返信を考えた人に感謝します。:-)私は数日間、誰かが本当に解決策を持っている場合に備えて、このままにしておきます。

関連する問題