简体   繁体   English

C#编写XML

[英]C# writing to XML

I have an application that write some information to XML file here it is: 我有一个将一些信息写入XML文件的应用程序,它是:

private void saveFileDialog1_FileOk(object sender, CancelEventArgs e)
{
    openedFilePath = saveFileDialog1.FileName;
    XmlWriterSettings set = new XmlWriterSettings();
    set.Indent = true;
    set.NewLineOnAttributes = true;
    using (XmlWriter writer = XmlWriter.Create(saveFileDialog1.FileName, set))
    {
        writer.WriteStartDocument();
        writer.WriteStartElement("Tree");
        writer.WriteStartElement("languages");
        foreach (TabPage page in textTC.TabPages)
        {
            writer.WriteStartElement("language");
            writer.WriteElementString("lan", page.Text);
            writer.WriteEndElement();
        }
        writer.WriteEndElement();
        writer.WriteStartElement("variables");
        foreach (Variable v in Form4.variables)
        {
            writer.WriteStartElement("variableOut");
            writer.WriteElementString("varName", v.varName);

            if (v.type == VariableType.BOOL)
                writer.WriteElementString("type", "bool");

            if (v.type == VariableType.INT)
                writer.WriteElementString("type", "int");

            writer.WriteElementString("value", v.value);
            writer.WriteEndElement();
        }
        writer.WriteEndElement();
        foreach (TabPage page in textTC.TabPages)
        {

            writer.WriteStartElement(page.Text);
            writer.WriteStartElement("phrases");

            for (int i = 0; i < dialogElements.Count; i++)
            {
                writer.WriteStartElement("phrase");
                writer.WriteElementString("ID", dialogElements[i].ID);
                writer.WriteElementString("indexInBranch", dialogElements[i].indexInBranch.ToString());
                writer.WriteElementString("characterName", dialogElements[i].characterName);
                writer.WriteElementString("text", dialogElements[i].dialogText);
                writer.WriteElementString("choiceText", dialogElements[i].choiceText);
                writer.WriteElementString("fileName", dialogElements[i].fileName);
                writer.WriteElementString("jumpTo", dialogElements[i].jumpTo.ToString());
                writer.WriteElementString("idToJump", dialogElements[i].idToJump);
                writer.WriteElementString("soundsFolder", soundsFolder);
                writer.WriteEndElement();
            }

            writer.WriteEndElement();

            writer.WriteStartElement("elements");

            for (int i = 0; i < Form5.operationsOfElements.Count; i++)
            {
                writer.WriteStartElement("element");
                writer.WriteElementString("ID", Form5.operationsOfElements[i].id);

                for (int j = 0; j < Form5.operationsOfElements[i].setElems.Count; j++)
                {
                    writer.WriteStartElement("SET");
                    writer.WriteElementString("variable", Form5.operationsOfElements[i].setElems[j].variable);
                    writer.WriteElementString("operation", Form5.operationsOfElements[i].setElems[j].operation);
                    writer.WriteElementString("value", Form5.operationsOfElements[i].setElems[j].value);
                    writer.WriteEndElement();
                }

                for (int j = 0; j < Form5.operationsOfElements[i].checkElems.Count; j++)
                {
                    writer.WriteStartElement("CHECK");
                    writer.WriteElementString("variable", Form5.operationsOfElements[i].checkElems[j].variable);
                    writer.WriteElementString("condition", Form5.operationsOfElements[i].checkElems[j].condition);
                    writer.WriteElementString("value", Form5.operationsOfElements[i].checkElems[j].value);
                    writer.WriteElementString("xmlFile", Form5.operationsOfElements[i].checkElems[j].xmlFile);
                    writer.WriteEndElement();
                }

                writer.WriteEndElement();
            }

            writer.WriteEndElement();
            writer.WriteEndElement();
            writer.WriteEndElement();
        }
        writer.WriteEndDocument();
    }
}

Initially it was working perfectly. 最初,它运行良好。 But when I added some more elements it begun to give me an error like this: 但是,当我添加更多元素时,它开始给我这样的错误:

An exception of type 'System.InvalidOperationException' occurred in System.Xml.dll but was not handled in user code System.Xml.dll中发生类型为'System.InvalidOperationException'的异常,但未在用户代码中处理

Additional information: Writing StartElement when EndRootElement is called will produce invalid XML document. 附加信息:在调用EndRootElement时编写StartElement将产生无效的XML文档。 In order to be able to write fragmentXML ConformanceLevel should have property of ConformanceLevel.Fragment or ConformanceLevel.Auto. 为了能够编写fragmentXML,ConformanceLevel应该具有ConformanceLevel.Fragment或ConformanceLevel.Auto的属性。

Exception is raised in this line: writer.WriteStartElement(page.Text); 此行引发异常:writer.WriteStartElement(page.Text);

I would say you have an incorrect number of WriteEndElement calls. 我会说您的WriteEndElement调用次数不正确。 If you can find the line in the code from the exception this will help you find where the problem is. 如果您可以从异常中找到代码中的行,这将帮助您找到问题所在。

There is no exception handling in the method example as provided. 提供的方法示例中没有异常处理。 Add try except and use the debugger to see where the exception is raised. 添加try except然后使用调试器查看引发异常的位置。

you are wrongly ended the languages inside the for each loop..it should come outside the loop 您错误地结束了for每个循环中的语言..它应该在循环之外

from down 5th line WriteEndElement(); 从第5行开始WriteEndElement(); cut it and past it out side of the close bracket (3rd one from down) past before writer.WriteEndDocument(); 切下并从作家前面移至靠近方括号(从下往下第三个)的旁边。WriteEndDocument();

Thanks all for helping. 谢谢大家的帮助。 I have found my mistake. 我发现了我的错误。 There were two extra WriteEndElements(); 有两个额外的WriteEndElements(); in 3rd block! 在第三块!

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM