我可以毫不费力地将XML读写到Dataset中,但是如果我用ds.WriteXml("Testdata.xml")保存DataSet,就会生成一个额外的标记<NewDataSet>.......</NewDataSet>。
有没有可能抑制这种标签生成?
发布于 2011-03-26 21:29:01
dataset可以包含多个表,而有效的XML文件必须包含单个根节点,这就是将其包装在此节点中的原因。您可以在创建DataSet时指定根节点的名称:
var ds = new DataSet("root");但是,如果您想删除它,可以首先将DataSet加载到XDocument或XmlDocument中,然后提取所需的节点并将其保存到一个文件中。
发布于 2012-02-11 01:45:04
我也想做同样的事情,以便流传输序列化的DataRows,而不会产生表之类的开销。我的解决方案是使用临时DataTable作为一种缓冲区,我用块中的DataRows填充它,然后生成我附加到流中的DataRows。为了重用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<string> _elementFilter;
private int _currentElementDepth;
private Stack<int> _sightedElementDepths;
public ElementSkippingXmlWriter(Stream stream, Predicate<string> elementFilter)
: base(stream, Encoding.UTF8)
{
_elementFilter = elementFilter;
_sightedElementDepths = new Stack<int>();
}
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();
}
}发布于 2015-07-28 00:11:18
对于像我这样“高效”的人,这里有简单的XDocument和XmlDocument编解码器(https://dotnetfiddle.net/s2VP0k上的现场示例)。虽然在我的简单测试中,XmlDocument通常更快,但我更喜欢它的简单性。
XDocument:
return System.Xml.Linq.XElement
.Parse(xmlString)
.FirstNode
.ToString(); // <c><a>123</a></c>XmlDocument:
var xmlDoc = new System.Xml.XmlDocument();
xmlDoc.LoadXml(xmlString);
return xmlDoc.DocumentElement.InnerXml; // <c><a>123</a></c>https://stackoverflow.com/questions/5442437
复制相似问题