XmlDocument.Load (xml) генерирует ошибку No Root Element из сериализованного кода XmlSerializer. - PullRequest
2 голосов
/ 28 июля 2010

У меня есть такой класс:

[XmlRoot"MyMessageType")]
public class MyMessageType : BaseMessageType
{
    [XmlElement("MessageId")]
    //Property for MessageId

    ...
    <snip>

    //end properties.
}

Этот класс содержит статический метод для создания экземпляра XmlDocument для передачи на сервер BizTalk. Вот так:

public static XmlDocument GetMyMessageType(string input1, string input2 ...)

GetMyMessageType создает экземпляр MyMessageType, затем вызывает следующий код:

XmlSerializer outSer = new XmlSerializer(instance.GetType());
using (MemoryStream mem = new MemoryStream())
using (XmlWriter _xWrite = XmlWriter.Create(mem))
{
  outSer.Serialize(_xWrite, instance);
  XmlDocument outDoc = new XmlDocument();
  outDoc.Load(XmlReader.Create(mem));
  return outDoc;
}

Когда я пытаюсь запустить этот код, я получаю XmlException «Корневой элемент отсутствует». Когда я изменяю код для вывода в тестовый файл, я получаю правильно оформленный документ Xml. Может кто-нибудь сказать мне, почему я мог бы выводить в файл, но не как XmlDocument?

1 Ответ

6 голосов
/ 28 июля 2010

Вы не перемотали MemoryStream, и вы даже не знаете, что писатель сбросил в поток. Я хотел бы что-то еще, как:

using (MemoryStream mem = new MemoryStream()) {
    outSer.Serialize(mem, instance);
    mem.Position = 0;
    XmlDocument outDoc = new XmlDocument();
    outDoc.Load(mem);
    return outDoc;
}

На самом деле, я мог бы даже сериализовать вместо StringWriter; сохранить некоторые накладные расходы на кодирование / декодирование:

string xml;
using (StringWriter writer = new StringWriter()) {
    outSer.Serialize(writer, instance);
    xml = writer.ToString();
}
XmlDocument outDoc = new XmlDocument();
outDoc.LoadXml(xml);
return outDoc;
...