如何获取正在由XMLWriter写入的当前项目
我有一系列由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的所有属性和方法,但是我找不到一种方法来完成它。是否可能有某种类型的异常陷阱会将它提供给我?任何帮助或想法表示赞赏。
尝试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);
}
}
}
最简单的方法就是环绕XmlWriter.WriteStartElement等小的辅助方法,并赶上你的例外存在。
是的,我想过。在将其呈现给XMLWriter之前,我还考虑检查每个字段是否为null。不幸的是,如果你有大约200个领域,这些都不是一个有吸引力的选择......感谢您的回应。 – Morepork
事实证明,我正在寻找解决问题的错误结局。我不应该对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#中的异常处理的所有内容之后,我得到了更多的信息,但没有更明智的做法。我找不到框架的解决方案,所以我几乎没有办法,只能通过一种方法来推送所有设置,该方法将执行实际的写入操作,并捕获当时的任何异常,并提供可用的违规字段该方法。
我觉得这样不雅,但我不能在这上面花更多时间。非常感谢所有回复的人和那些想回应的人::-)为了几天内有人真的有解决方案,我会保持开放。
我是LINQ的粉丝,所以我很想看到你发布的代码。谢谢。但是,我不确定这是如何解决我的实际问题。我当然可以将设置作为块添加到XML文件中,但是如果出现错误(如空字段),它可能仍会给我不正确的XML,我仍然不知道哪个字段导致了问题。即使我设法写入文件没有问题,无论读取它将不得不处理它,所以我认为它只是移动问题。应该抛出异常是正确的。我的问题是知道WHICH字段导致它被抛出。 – Morepork
你永远不应该有一个空例外。这是一个编程错误,应该在应用程序发布之前解决。使用XmlWriter不是首选的方法。你必须适当平衡开放标签和结束标签。 Linq结束标签会自动处理。 – jdweng
是的,你是对的。它引发错误,因为字段中有一个x00字符,而不是因为该字段为空。我试过空字段,他们工作得很好。 – Morepork