在没有标记的情况下保存数据集ds.WriteXml(…)?

我可以在没有任何问题的情况下读取和写入XML文件到数据集中,但是如果我使用ds.WriteXml("Testdata.xml")保存DataSet, ds.WriteXml("Testdata.xml")额外的Tag .......是generrated。

是否有可能压制这个标签一般?

数据集可以包含多个表,并且有效的XML文件必须包含单个根节点,这就是它包含在此节点中的原因。 您可以在创建DataSet时指定根节点的名称:

 var ds = new DataSet("root"); 

但是如果要删除它,可以先将DataSet加载到XDocument或XmlDocument中 ,然后提取所需的节点并将其保存到文件中。

我希望做同样的事情,以便流动序列化的DataRows,而不需要表等的开销。 我的解决方案是使用临时DataTable作为一种缓冲区,我以块的forms填充DataRows,然后生成我附加到流的XML。 为了重用DataTable.WriteXml,我必须解决同样的问题,我希望它有效。

我选择的是创建我自己的自定义XmlWriter,它比听起来简单得多。 它的工作原理是跳过满足谓词条件的元素。 在这种情况下,谓词是元素名称是否与预期的DataSet名称相同。

 var writer = new RootlessDataSetXmlWriter( File.OpenWrite(@"C:\temp\ds.xml") "YourDataSetName"); dataSet.WriteXml(writer, XmlWriteMode.IgnoreSchema); writer.Flush(); writer.Close(); 

下面是RootlessDataSetXmlWriter和ELementSkippingXmlWritter基类的实现。

 public class RootlessDataSetXmlWriter : ElementSkippingXmlWriter { private string _dataSetName; public RootlessDataSetXmlWriter(Stream stream, string dataSetName) : base(stream, (e) => string.Equals(e, dataSetName, StringComparison.OrdinalIgnoreCase)) { _dataSetName = dataSetName; this.Formatting = System.Xml.Formatting.Indented; } } public class ElementSkippingXmlWriter : XmlTextWriter { private Predicate _elementFilter; private int _currentElementDepth; private Stack _sightedElementDepths; public ElementSkippingXmlWriter(Stream stream, Predicate elementFilter) : base(stream, Encoding.UTF8) { _elementFilter = elementFilter; _sightedElementDepths = new Stack(); } public override void WriteStartElement(string prefix, string localName, string ns) { if (_elementFilter(localName)) { // Skip the root elements _sightedElementDepths.Push(_currentElementDepth); } else { base.WriteStartElement(prefix, localName, ns); } _currentElementDepth++; } public override void WriteEndElement() { _currentElementDepth--; if (_sightedElementDepths.Count > 0 && _sightedElementDepths.Peek() == _currentElementDepth) { _sightedElementDepths.Pop(); return; } base.WriteEndElement(); } } 

对于像我这样“高效”的人,这里有简单的XDocument和XmlDocument codez( https://dotnetfiddle.net/s2VP0k上的实例)。 虽然XmlDocument在我的简单测试中通常更快,但我更喜欢XDocument的简单性。

的XDocument:

 return System.Xml.Linq.XElement .Parse(xmlString) .FirstNode .ToString(); // 123 

XmlDocument的:

 var xmlDoc = new System.Xml.XmlDocument(); xmlDoc.LoadXml(xmlString); return xmlDoc.DocumentElement.InnerXml; // 123