2017-11-04 60 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#中的异常处理的所有内容之后,我得到了更多的信息,但没有更明智的做法。我找不到框架的解决方案,所以我几乎没有办法,只能通过一种方法来推送所有设置,该方法将执行实际的写入操作,并捕获当时的任何异常,并提供可用的违规字段该方法。

我觉得这样不雅,但我不能在这上面花更多时间。非常感谢所有回复的人和那些想回应的人::-)为了几天内有人真的有解决方案,我会保持开放。

相关问题