Как вы подавляете имя набора данных, записываемое при использовании 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();