转换Text.txt文件.xml格式

时间:2010-06-07 18:15:47

标签: c# .net xml

我尝试使用以下代码将文本文件转换为xml文件。但我在第12行得到错误。任何人都可以纠正它并给我正确答案。

private void button1_Click(object sender, EventArgs e)
{

    string[] lines = File.ReadAllLines("ex3.txt");
    char[] ca = new char[] { '~' };
    using (XmlTextWriter writer = new XmlTextWriter("ex3.xml", null))
    {
        writer.Formatting = Formatting.Indented;
        writer.WriteStartDocument();
        writer.WriteStartElement("Root");
        writer.WriteStartElement("Header");
        writer.WriteStartElement("H1");
        writer.WriteString(lines[0].TrimEnd().Split(ca, 2)[1]);
        writer.WriteEndElement();
        writer.WriteStartElement("H2");
        writer.WriteString(lines[1].TrimEnd().Split(ca, 2)[1]);
        writer.WriteEndElement();
        writer.WriteEndElement();
        writer.WriteStartElement("Details");
        for (int i = 2; i < lines.Length - 2; i++)
        {
            writer.WriteStartElement("D" + (i - 1).ToString());
            writer.WriteString(lines[i].TrimEnd().Split(ca, 2)[1]);
            writer.WriteEndElement();
        }
        writer.WriteEndElement();
        writer.WriteStartElement("Footer");
        writer.WriteStartElement("F1");
        writer.WriteString(lines[lines.Length - 2].TrimEnd().Split(ca, 2)[1]);
        writer.WriteEndElement();
        writer.WriteStartElement("F2");
        writer.WriteString(lines[lines.Length - 1].TrimEnd().Split(ca, 2)[1]);
        writer.WriteEndElement();
        writer.WriteEndElement();
        writer.WriteEndDocument();
    }
}

由于

这是错误

System.IndexOutOfRangeException未处理Message =“Index超出了数组的范围。”来源= “txtxml”   堆栈跟踪:        at txtxml.Form1.button1_Click(Object sender,EventArgs e)在C:\ Documents and Settings \ Crusaders \ My Documents \ Visual Studio 2005 \ Projects \ txtxml \ txtxml \ Form1.cs:第31行        在System.Windows.Forms.Control.OnClick(EventArgs e)        在System.Windows.Forms.Button.OnClick(EventArgs e)        在System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)        在System.Windows.Forms.Control.WmMouseUp(消息&amp; m,MouseButtons按钮,Int32点击)        在System.Windows.Forms.Control.WndProc(消息&amp; m)        在System.Windows.Forms.ButtonBase.WndProc(消息&amp; m)        在System.Windows.Forms.Button.WndProc(消息&amp; m)        在System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message&amp; m)        在System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message&amp; m)        在System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd,Int32 msg,IntPtr wparam,IntPtr lparam)        在System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG&amp; msg)        在System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID,Int32 reason,Int32 pvLoopData)        在System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason,ApplicationContext context)        在System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason,ApplicationContext context)        在System.Windows.Forms.Application.Run(Form mainForm)        在C:\ Documents and Settings \ Crusaders \ My Documents \ Visual Studio 2005 \ Projects \ txtxml \ txtxml \ Program.cs中的txtxml.Program.Main():第17行        在System.AppDomain.nExecuteAssembly(程序集程序集,String [] args)        在System.AppDomain.ExecuteAssembly(String assemblyFile,Evidence assemblySecurity,String [] args)        在Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()        在System.Threading.ThreadHelper.ThreadStart_Context(对象状态)        在System.Threading.ExecutionContext.Run(ExecutionContext executionContext,ContextCallback回调,对象状态)        在System.Threading.ThreadHelper.ThreadStart()

2 个答案:

答案 0 :(得分:2)

该代码假定文件中至少存在四行文字。 您确定是这种情况吗?

我建议你编写代码,先断言lines数组实际上包含的行数和预期的一样多。完全有可能该文件没有 - 或者换行符是非标准的,因此ReadAllLines()无法识别。

string[] lines = File.ReadAllLines("ex3.txt"); 
char[] ca = new char[] { '~' }; 
if( lines.Length < 4 ) { /* decide how to handle this... */ }

//... your code

作为一般规则,在解析或拆分您希望具有特定格式的文件内容时,您应该以一种断言您的期望的方式编写代码。否则,当出现问题时,可能很难诊断出现的情况。

您可能需要重新审核的代码中的另一个位置是:

writer.WriteString(lines[0].TrimEnd().Split(ca, 2)[1]); 

在这里,再次,你假设该行具有某种结构,然后使用索引运算符[]访问结果中的第二个索引 - 这也可能是一个潜在的错误的来源。

答案 1 :(得分:0)

@LBushkin引发了代码的一个主要问题。
第二个问题是它假设每行包含至少一个'〜'(你继续访问.split(ca,2)[1]),这在您发布的示例txt文件中似乎不是这种情况。 我建议替换表单中的所有代码:

writer.WriteString(lines[0].TrimEnd().Split(ca, 2)[1]);

string[] splitLine = lines[0].TrimEnd().Split(ca,2);
if(splitLine.Length >1)
  writer.WriteString(splitLine[1]);