【问题标题】:C# writing to XMLC# 写入 XML
【发布时间】:2017-06-02 17:05:12
【问题描述】:

我有一个将一些信息写入 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();
    }
}

最初它运行良好。但是当我添加更多元素时,它开始给我这样的错误:

System.Xml.dll 中出现“System.InvalidOperationException”类型的异常,但未在用户代码中处理

附加信息:在调用 EndRootElement 时编写 StartElement 会产生无效的 XML 文档。为了能够编写 fragmentXML,ConformanceLevel 应该具有 ConformanceLevel.Fragment 或 ConformanceLevel.Auto 的属性。

在这一行引发了异常: writer.WriteStartElement(page.Text);

【问题讨论】:

  • 如果将代码中的所有字符串变量都替换为const字符串,还会出现错误吗?
  • 你可能有一个或多个 WriteEndElement 太多
  • 符文FS我也这么认为。我添加了“语言”块。所以这可能是一个关键。在“语言”块之前它正在工作。

标签: c# xml


【解决方案1】:

你错误地结束了 for each 循环中的语言。它应该在循环之外

从第 5 行开始 WriteEndElement();将其剪切并从右括号的一侧(从下数第三个)越过 writer.WriteEndDocument();

【讨论】:

    【解决方案2】:

    我会说您的 WriteEndElement 调用次数不正确。如果您可以从异常中找到代码中的行,这将帮助您找到问题所在。

    【讨论】:

      【解决方案3】:

      提供的方法示例中没有异常处理。添加try except 并使用调试器查看引发异常的位置。

      【讨论】:

      • writer.WriteStartElement(page.Text);这是异常来源。
      【解决方案4】:

      感谢大家的帮助。我发现了我的错误。有两个额外的 WriteEndElements();在第三个街区!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多