2017-11-04 51 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); 

...等等。 我的問題是,如果有一個異常(例如像一個空字段),它會進入catch塊並按照我們的預期報告異常,但我不知道當時它正在寫入哪個字段。

我的問題:

有什麼辦法,我可以得到當前字符串被寫入,發生異常時?我搜索了網頁沒有成功,我翻閱了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文件中,但是如果出現錯誤(如空字段),它可能仍會給我不正確的XML,我仍然不知道哪個字段導致了問題。即使我設法寫入文件沒有問題,無論讀取它將不得不處理它,所以我認爲它只是移動問題。應該拋出異常是正確的。我的問題是知道WHICH字段導致它被拋出。 – Morepork

+0

你永遠不應該有一個空例外。這是一個編程錯誤,應該在應用程序發佈之前解決。使用XmlWriter不是首選的方法。你必須適當平衡開放標籤和結束標籤。 Linq結束標籤會自動處理。 – jdweng

+0

是的,你是對的。它引發錯誤,因爲字段中有一個x00字符,而不是因爲該字段爲空。我試過空字段,他們工作得很好。 – 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#中的異常處理的所有內容之後,我得到了更多的信息,但沒有更明智的做法。我找不到框架的解決方案,所以我幾乎沒有辦法,只能通過一種方法來推送所有設置,該方法將執行實際的寫入操作,並捕獲當時的任何異常,並提供可用的違規字段該方法。

我覺得這樣不雅,但我不能在這上面花更多時間。非常感謝所有回覆的人和那些想回應的人::-)爲了幾天內有人真的有解決方案,我會保持開放。

相關問題