首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >保存DataSet ds.WriteXml(...)没有<NewDataSet>标签?

保存DataSet ds.WriteXml(...)没有<NewDataSet>标签?
EN

Stack Overflow用户
提问于 2011-03-26 20:57:49
回答 3查看 8.3K关注 0票数 6

我可以毫不费力地将XML读写到Dataset中,但是如果我用ds.WriteXml("Testdata.xml")保存DataSet,就会生成一个额外的标记<NewDataSet>.......</NewDataSet>

有没有可能抑制这种标签生成?

EN

回答 3

Stack Overflow用户

发布于 2011-03-26 21:29:01

dataset可以包含多个表,而有效的XML文件必须包含单个根节点,这就是将其包装在此节点中的原因。您可以在创建DataSet时指定根节点的名称:

代码语言:javascript
复制
var ds = new DataSet("root");

但是,如果您想删除它,可以首先将DataSet加载到XDocumentXmlDocument中,然后提取所需的节点并将其保存到一个文件中。

票数 4
EN

Stack Overflow用户

发布于 2012-02-11 01:45:04

我也想做同样的事情,以便流传输序列化的DataRows,而不会产生表之类的开销。我的解决方案是使用临时DataTable作为一种缓冲区,我用块中的DataRows填充它,然后生成我附加到流中的DataRows。为了重用DataTable.WriteXml,我必须解决同样的问题,并且我希望它是高效的。

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

代码语言:javascript
复制
var writer = new RootlessDataSetXmlWriter(
    File.OpenWrite(@"C:\temp\ds.xml")
    "YourDataSetName");
dataSet.WriteXml(writer, XmlWriteMode.IgnoreSchema);
writer.Flush();
writer.Close();

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

代码语言:javascript
复制
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();
    }
}
票数 1
EN

Stack Overflow用户

发布于 2015-07-28 00:11:18

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

XDocument:

代码语言:javascript
复制
return System.Xml.Linq.XElement
    .Parse(xmlString)
    .FirstNode
    .ToString(); // <c><a>123</a></c>

XmlDocument:

代码语言:javascript
复制
var xmlDoc = new System.Xml.XmlDocument();
xmlDoc.LoadXml(xmlString);
return xmlDoc.DocumentElement.InnerXml; // <c><a>123</a></c>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5442437

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档