Как вы подавляете имя набора данных, записываемое при использовании WriteXml?

C# - при использовании: DataSet.WriteXml (filePath);

Имя набора данных будет записано как корневой элемент. Как вы это подавляете?

Примечание: у меня есть схема, связанная с этим набором данных, данные XML правильно считываются в схему.

Токовый выход:

<DataSet>  //dataset name prints -- REMOVE
  <HAPPY>
    <HAPPY2>BLAH</HAPPY2>
  </HAPPY>
</DataSet>  //dataset name prints  -- REMOVE

Желаемый результат:

  <HAPPY>
    <HAPPY2>BLAH</HAPPY2>
  </HAPPY>

3 ответа

Решение

Элегантным решением было бы использовать XSLT, но это может быть слишком много для этой простой цели. Вы также можете реализовать свой собственный XmlWriter который перенаправляет каждую операцию в реальную реализацию, кроме корневого элемента. Но на самом деле это своего рода взлом, а не самое приемлемое решение.

В этом простом случае я бы записал XML в память (StringWriter + XmlWriter), загрузите это в XmlDocumentи переставить вещи в DOM.

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

using(MemoryStream ms = new MemoryStream())
{
    dataSet.WriteXml(ms);
    ms.Position = 0;

    var children = XDocument.Load(ms).Root.Elements();
}

Этот код оставляет вас с коллекцией XElement объекты, которые представляют каждый DataTable в вашем DataSet, Оттуда вы можете делать все, что вам нужно с этим делать.

Это работает...

        XmlWriter w = new XmlTextWriter("C:Blah.xml", Encoding.UTF8);
        w.WriteProcessingInstruction("xml", "version='1.0' encoding='UTF-8'");


        XmlDataDocument xd = new XmlDataDocument(DataSet);


        XmlDataDocument xdNew = new XmlDataDocument();
        DataSet.EnforceConstraints = false;


        XmlNode node = xdNew.ImportNode(xd.DocumentElement.LastChild, true);
        node.WriteTo(w);
        w.Close();
Другие вопросы по тегам