Набор данных -> XML-документ - Загрузка набора данных в XML-документ - C # .Net - PullRequest
1 голос
/ 19 апреля 2010

Я пытаюсь прочитать набор данных как XML и загрузить его в XML-документ.

XmlDocument contractHistoryXMLSchemaDoc = new XmlDocument();

using (MemoryStream ms = new MemoryStream())
{
   //XmlWriterSettings xmlWSettings = new XmlWriterSettings();

   //xmlWSettings.ConformanceLevel = ConformanceLevel.Auto;
   using (XmlWriter xmlW = XmlWriter.Create(ms))
   {
      xmlW.WriteStartDocument();
      dsContract.WriteXmlSchema(xmlW);
      xmlW.WriteEndDocument();
      xmlW.Close();
      using (XmlReader xmlR = XmlReader.Create(ms))
      {
         contractHistoryXMLSchemaDoc.Load(xmlR);
      }
   }
}

Но я получаю сообщение об ошибке - "Root Element Missing".

Есть идеи?

Обновление

Когда я делаю xmlR.ReadInnerXML (), он пуст.Кто-нибудь знает почему?

NLV

Ответы [ 4 ]

4 голосов
/ 19 апреля 2010

Несколько слов об оригинальном коде:

  • Вам не нужно вызывать методы начала и конца записи: DataSet.WriteXmlSchema создает полный, правильно сформированный xsd.
  • После написания схемы поток позиционируется на своем конце, так что XmlReader не для чтения при вызове XmlDocument.Load.

Итак, главное, вам нужно сбросить положение MemoryStream с помощью Seek. Вы также можете немного упростить весь метод: вам не нужен XmlReader или писатель. У меня работает следующее:

XmlDocument xd = new XmlDocument();
using(MemoryStream ms = new MemoryStream())  
{
    dsContract.WriteXmlSchema(ms);

    // Reset the position to the start of the stream
    ms.Seek(0, SeekOrigin.Begin);
    xd.Load(ms);
}
1 голос
/ 19 апреля 2010
XmlDocument contractHistoryXMLSchemaDoc = new XmlDocument();

using (MemoryStream ms = new MemoryStream())
{
   dsContract.WriteXml(ms);
   ms.Seek(0, SeekOrigin.Begin);
   using(XmlReader xmlR = XmlReader.Create(ms))
   {
       contractHistoryXMLSchemaDoc.Load(xmlR);
   }

}
0 голосов
/ 13 июля 2012

Вот, пожалуйста. Если из соглашения об именовании ваших переменных (не смотря на вопрос, который вы задали, который, кажется, изменится ...), вам нужно загрузить XML-схему набора данных в XML-документ, который вы назвали схемой, ниже приведен код для загрузки схемы набора данных в XMLDocument.

Мне нужна схема набора данных в отдельном XML-документе. - NLV 19 апреля 2010 года в 12:00

Ответ:

XmlDocument contractHistoryXMLSchemaDoc = new XmlDocument();
using (MemoryStream ms = new MemoryStream())
{
    dsContract.WriteXmlSchema(ms);
    ms.Seek(0, SeekOrigin.Begin);
    contractHistoryXMLSchemaDoc.Load(ms);
}

Если вы ищете, как загрузить данные таблицы набора данных в документ XML (обратите внимание, я удалил слово Schema из имени переменной XMLDocument)

Ваш вопрос:

Извините, я вас не понимаю. Мне нужно получить XML этого набора данных в XML-документе. - NLV, 19 апреля 2010 г., 11: 56

Ответ:

XmlDocument contractHistoryXMLDoc = new XmlDocument();
using (MemoryStream ms = new MemoryStream())
{
    dsContract.WriteXml(ms,XmlWriteMode.IgnoreSchema);
    ms.Seek(0, SeekOrigin.Begin);
    contractHistoryXMLDoc.Load(ms);
}

Если вы хотите, чтобы Схема и данные были установлены в отдельных документах, код приведен выше. Если вам нужна только схема или данные и документ XML, используйте приведенный выше фрагмент кода, относящийся к вашему вопросу. Если вы хотите, чтобы XML-схема и Данные были в одном XML-документе, используйте этот код.

XmlDocument contractHistoryXMLDoc = new XmlDocument();
using (MemoryStream ms = new MemoryStream())
{
    dsContract.WriteXml(ms,XmlWriteMode.WriteSchema);
    ms.Seek(0, SeekOrigin.Begin);
    contractHistoryXMLDoc.Load(ms);
}

Ваш вопрос:

Но я получаю ошибку - "Отсутствует корневой элемент". Есть идеи? Обновить Когда я делаю xmlR.ReadInnerXML (), он пуст. Кто-нибудь знает почему? NLV

Ответ:

В вашем коде есть основные проблемы в том, как вы думаете, что он работает, что означает, что он на самом деле не создает XMLSchema и XmlData (dsContract), поэтому вы видите пустой XMLDocument.

Вероятно, это поможет вам полностью объяснить, что вы хотите, а затем не отвечать всем, используя частичные предложения, которые неправильно поняты, и вам приходится продолжать отвечать более частичными предложениями.

0 голосов
/ 19 апреля 2010

Все, что вам действительно нужно сделать, это вызвать contractHistoryXMLSchemaDoc.Save (ms). Это поместит XML в MemoryStream.

XmlDocument contractHistoryXMLSchemaDoc = new XmlDocument();

using (MemoryStream ms = new MemoryStream())
{
    contractHistoryXMLSchemaDoc.Save(ms);
    ms.Flush();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...