如何获取XMLWriter正在编写的当前项

时间:2017-11-04 06:37:03

标签: c# xml

我在C#中用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块并按照我们的预期报告异常,但我不知道它当时写的WHICH字段。

我的问题:

当发生异常时,有什么办法可以让当前字符串被写入?我在网上搜索没有成功,我查看了XMLWriter的每个属性和方法,但我找不到办法。是否有某种类型的异常陷阱可以提供给我?任何帮助或想法的赞赏。

3 个答案:

答案 0 :(得分:0)

尝试xml linq,这是一个用于读写xml

的新Net Library
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);
        }
    }
}

答案 1 :(得分:0)

最简单的方法是在XmlWriter.WriteStartElement等周围包装小帮助器方法,并在那里捕获异常。

答案 2 :(得分:0)

事实证明我正在寻找问题的错误解决方案。而不是困惑的XMLWriter,我应该做的是调查EXCEPTION。 (我确实这样做但只针对Exception类,我需要进一步查看。)问题看起来可以通过嵌套一些异常catch块来轻松解决,所以:

" ... WHERE (pGroupID= ProductGroupIDDropDownList.SelectedItem.Value)"

...             }

SQL Injection

...             }

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

...

然而,我被“ParamName”误导了,这并不意味着我的想法...这总是返回null并且我没有好转。

在花了几个小时阅读C#中关于异常处理的所有内容之后,我更了解情况,但没有更明智。我无法找到框架的解决方案,所以我几乎没有办法,只是通过一个方法来推送所有设置,这个方法将执行实际的写入并捕获当时的任何异常,并且有可用的违规字段,因为它将被传递到那种方法。

我认为这不优雅,但我不能花更多的时间在上面。非常感谢所有回复的人以及那些想要回应的人...... :-)如果有人真的有解决方案的话,我会保持开放状态几天。