【发布时间】:2017-11-02 03:39:28
【问题描述】:
XML 文档中存在错误 (8, 20)。内部 1:意外的 XML 声明。 XML 声明必须是文档中的第一个节点,并且之前不允许出现空白字符。
好的,我明白这个错误了。
然而,我是如何得到它的,这让我感到困惑。
我使用 Microsoft 的序列化工具创建文档。然后,我转身尝试再次使用 Microsoft 的反序列化工具将其读回。
我无法控制以正确格式写入 XML 文件 - 我可以看到。
这是我用来读写的单一例程。
private string xmlPath = System.Web.Hosting.HostingEnvironment.MapPath(WebConfigurationManager.AppSettings["DATA_XML"]);
private object objLock = new Object();
public string ErrorMessage { get; set; }
public StoredMsgs Operation(string from, string message, FileAccess access) {
StoredMsgs list = null;
lock (objLock) {
ErrorMessage = null;
try {
if (!File.Exists(xmlPath)) {
var root = new XmlRootAttribute(rootName);
var serializer = new XmlSerializer(typeof(StoredMsgs), root);
if (String.IsNullOrEmpty(message)) {
from = "Code Window";
message = "Created File";
}
var item = new StoredMsg() {
From = from,
Date = DateTime.Now.ToString("s"),
Message = message
};
using (var stream = File.Create(xmlPath)) {
list = new StoredMsgs();
list.Add(item);
serializer.Serialize(stream, list);
}
} else {
var root = new XmlRootAttribute("MessageHistory");
var serializer = new XmlSerializer(typeof(StoredMsgs), root);
var item = new StoredMsg() {
From = from,
Date = DateTime.Now.ToString("s"),
Message = message
};
using (var stream = File.Open(xmlPath, FileMode.Open, FileAccess.ReadWrite)) {
list = (StoredMsgs)serializer.Deserialize(stream);
if ((access == FileAccess.ReadWrite) || (access == FileAccess.Write)) {
list.Add(item);
serializer.Serialize(stream, list);
}
}
}
} catch (Exception error) {
var sb = new StringBuilder();
int index = 0;
sb.AppendLine(String.Format("Top Level Error: <b>{0}</b>", error.Message));
var err = error.InnerException;
while (err != null) {
index++;
sb.AppendLine(String.Format("\tInner {0}: {1}", index, err.Message));
err = err.InnerException;
}
ErrorMessage = sb.ToString();
}
}
return list;
}
我的日常有什么问题吗?如果微软写了这个文件,在我看来它应该可以读回来。
它应该足够通用,任何人都可以使用。
这是我的 StoredMsg 类:
[Serializable()]
[XmlType("StoredMessage")]
public class StoredMessage {
public StoredMessage() {
}
[XmlElement("From")]
public string From { get; set; }
[XmlElement("Date")]
public string Date { get; set; }
[XmlElement("Message")]
public string Message { get; set; }
}
[Serializable()]
[XmlRoot("MessageHistory")]
public class MessageHistory : List<StoredMessage> {
}
它生成的文件在我看来没有任何问题。
我在这里看到了解决方案:
Error: The XML declaration must be the first node in the document
但是,在这种情况下,似乎有人已经有了他们想要阅读的 XML 文档。他们只需要修复它。
我有一个 XML 文档创建了我的 Microsoft,所以它应该被 Microsoft 读回。
【问题讨论】:
-
一个 XML 文档最多可以有一个声明(在开始时),并且最多可以有一个根元素。
-
问题是您正在添加到文件中。您反序列化,然后重新序列化到相同的流无需倒带并将大小调整为零。这会为您提供多个 root elements,这是 XML 标准所不允许的。
-
查看此处了解处理具有多个根元素的文档的方法:XML Error: There are multiple root elements 您还需要omit the XML declaration。
标签: c# xml c#-4.0 serialization