【问题标题】:getting error Token StartDocument in state End Document would result in an invalid XML document在状态 End Document 中获取错误 Token StartDocument 将导致 XML 文档无效
【发布时间】:2015-06-22 07:46:23
【问题描述】:

我正在尝试创建这个:

<?xml version="1.0" encoding="utf-8" ?>
<GetsafeActivitiesResponse xmlns="http://ggg.co.il">
<GetSafeActivitiesResult>
<ListofStrings>
  <string>
    <timestamp>2015 03:44:11</timestamp>
    <user>bbbbb</user>
    <code>ccdcdcd</code>
  </string>
</ListofStrings>
<returncode>55555</returncode>
<returnMSG>sssss</returnMSG>
</GetSafeActivitiesResult>
</GetsafeActivitiesResponse>

我的代码如下所示:

XmlWriterSettings settings = new XmlWriterSettings();
            settings.ConformanceLevel = ConformanceLevel.Fragment;
            settings.Indent = true;
            StringBuilder sb = new StringBuilder();
            XmlWriter writer = XmlWriter.Create(sb, settings);

            foreach (ActivityLogRecord activity in safeActivities)
                {
                    if (activity.Info1.ToLower().Contains(FileName.ToLower()))
                    {
                        string activityCode = "";
                        string direction = "Unknown";
                        string direction = "ddd";

                        writer.WriteStartDocument();
                        writer.WriteStartElement("GetSafeActivitiesResult");
                        writer.WriteStartElement("ListOfStrings","");

                        int i = 0;
                        while (results.Length > i)
                        {
                            writer.WriteStartElement("string");
                            writer.WriteStartElement("outFileName");
                            writer.WriteString(FileName);
                            writer.WriteEndElement();
                            writer.WriteStartElement("activityTmStamp");
                            writer.WriteString(activity.Time.ToString());
                            writer.WriteEndElement();
                            writer.WriteStartElement("userName");
                            writer.WriteString(activity.UserName);
                            writer.WriteEndElement();
                            writer.WriteStartElement("ActionID");
                            writer.WriteString(activityCode);
                            writer.WriteEndElement();
                            writer.WriteStartElement("direction");
                            writer.WriteString(direction);
                            writer.WriteEndElement();
                            writer.WriteStartElement("path");
                            writer.WriteString(activity.Info1);
                            writer.WriteEndElement();
                            writer.WriteEndElement();

                            //results[i] = string.Format("<acivityTmStamp>{0}</acivityTmStamp><username>{1}</username><ActionID>{2}</ActionID><direction>{3}</direction><path>{4}</path>", activity.Time, activity.UserName, activityCode, direction, activity.Info1);

                            i++;
                        }

                        writer.WriteEndElement();

                        writer.WriteStartElement("retunCode");
                        writer.WriteString("000");
                        writer.WriteEndElement();
                        writer.WriteStartElement("retunMessage");
                        writer.WriteString("000");

                        writer.WriteEndElement();


                        writer.WriteEndElement();
                        writer.WriteEndDocument();
                        writer.Flush();

                    }
                }

            returnErrorCode = "005";
            if (safe != null)
                safe.Dispose();

            if (Vault.Current.IsLoggedOn()) 
                UserSession.Logoff();

            returnErrorCode = "006";
            XmlDocument xmlOut = new XmlDocument();
            xmlOut.LoadXml(sb.ToString());
            writer.Close();
            return xmlOut.InnerXml.ToString(); 

        }
        catch (Exception ex)
        {
            this.LogWrite("GetSafeActivities", string.Format("Operation has failed: {0}", ex.Message), Session.SessionID, true);
            return string.Format("<ReturnCode>{0}</ReturnCode><ReturnMSG>{1}</ReturnMSG>", returnErrorCode, ex.Message) ;             
        }

当我尝试通过 IIS 运行代码时,我收到一条错误消息:

 <?xml version="1.0" encoding="UTF-8"?>
 <string    xmlns="http://www.securenet.co.il"><ReturnCode>004</ReturnCode><ReturnMSG>Token StartDocument in state End Document would result in an invalid XML document.</ReturnMSG></string

我仔细检查了一切是否正确打开和关闭。

【问题讨论】:

  • 您的代码不会生成示例中的 xml 结构。在您的代码中,ListofStrings 元素还包含“returncode”和retunMessage
  • 谢谢,我解决了这个问题,但仍然有同样的错误。
  • 您是否正在尝试创建具有多个根元素的 XML 文档?因为有效的 XML 必须只有一个 root element
  • 我在哪里定义根元素?这对我来说并不重要,我只是希望数据能够正常工作。
  • 如果你真的想创建一个具有多个根元素的类似 XML 的文档,你可能需要消除 WriteStartDocumentWriteEndDocument 调用,如下所示:stackoverflow.com/questions/13058921/…。或者改为创建一个外部根元素。

标签: c# .net xml xml-parsing xmlwriter


【解决方案1】:

问题是您需要将文档和根元素的创建移到循环之外:

            writer.WriteStartDocument();
            writer.WriteStartElement("GetSafeActivitiesResult");

            foreach (ActivityLogRecord activity in safeActivities)
            {
                if (activity.Info1.ToLower().Contains(FileName.ToLower()))
                {
                    // Write out the activity information
                }
            }

            writer.WriteEndElement();
            writer.WriteEndDocument();
            writer.Flush();

否则,如果您有多个文件符合条件activity.Info1.ToLower().Contains(FileName.ToLower()),那么您将尝试创建一个包含多个root elements 的 XML 文档,这是 XML 标准所不允许的。

【讨论】:

    【解决方案2】:

    XML 区分大小写。请尝试以下更正

    <?xml version="1.0" encoding="utf-8" ?>
    <GetsafeActivitiesResponse xmlns="http://ggg.co.il">
      <GetSafeActivitiesResult>
        <ListofStrings>
          <string>
            <timestamp>2015 03:44:11</timestamp>
            <user>bbbbb</user>
            <code>ccdcdcd</code>
          </string>
        </ListofStrings>
        <returncode>55555</returncode>
        <returnMSG>sssss</returnMSG>
      </GetSafeActivitiesResult>
    </GetsafeActivitiesResponse>
    ​
    

    【讨论】:

    • 这是我想要达到的最终结果,我用纯文本写的。我还没有从我的代码中得到这个。
    • 您可以在 VS 中执行以下操作来验证 XML:1) 菜单:项目:添加新项目:XML 文件。 2) 将您的 XML 代码粘贴到窗口中,保留一份 XML 第 1 行标识的副本。确保 XML ident 从第 1 行第 1 列开始。 3) 打开错误列表窗口。错误将显示在窗口中。必要时更正。该视图具有内置架构,可帮助您纠正问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多