如何将 XmlDocument 转换为数组<byte>?

Posted

技术标签:

【中文标题】如何将 XmlDocument 转换为数组<byte>?【英文标题】:How to convert an XmlDocument to an array<byte>? 【发布时间】:2010-12-02 18:48:49 【问题描述】:

我构造了一个XmlDocument,现在我想将它转换为一个数组。如何做到这一点?

谢谢,

【问题讨论】:

【参考方案1】:

尝试以下方法:

using System.Text;
using System.Xml;

XmlDocument dom = GetDocument()
byte[] bytes = Encoding.Default.GetBytes(dom.OuterXml);

如果您想保留文档的文本编码,则将Default编码更改为所需编码,或遵循Jon Skeet's suggestion。

【讨论】:

这是我目前使用的解决方案。问题在于这个对于大型 XML 文档会引发 OutOfMemoryException。 :// dom.OuterXmldom.Save 之间的另一个区别是 OuterXml 在一长行中包含 XML 数据而没有格式化。 Save 方法生成带有缩进的格式化 XML 文档。【参考方案2】:

将其写入MemoryStream,然后在流上调用ToArray

using System;
using System.IO;
using System.Text;
using System.Xml;

class Test

    static void Main(string[] args)
    
        XmlDocument doc = new XmlDocument();
        XmlElement root = doc.CreateElement("root");
        XmlElement element = doc.CreateElement("child");
        root.AppendChild(element);
        doc.AppendChild(root);

        MemoryStream ms = new MemoryStream();
        doc.Save(ms);
        byte[] bytes = ms.ToArray();
        Console.WriteLine(Encoding.UTF8.GetString(bytes));
    

要对格式进行更多控制,您可以从流中创建一个XmlWriter 并使用XmlDocument.WriteTo(writer)

【讨论】:

如果您要将 MemoryStream 作为输入传递给其他东西,请记住将位置设置回零。 doc.保存(毫秒); ms.Position = 0; 我意识到字节大小取决于编码,但我想知道这有多有效。 (我问是因为我的应用程序需要经常执行此操作(每秒至少 10 次。)给 MemoryStream 一个初始大小是否有意义?考虑到这一点,有没有办法获得一些预期的概念XmlDocument 的大小? @codesniffer:你可以每秒做 10 次非常多的工作。除非文件特别大,否则我不会出汗。至于你是否应该给MemoryStream 一个初始大小:你比我更能用你的数据进行基准测试。如果你关心性能,你应该仔细衡量它。这让您可以尝试更改。 @JonSkeet 感谢乔恩。不幸的是,数据大小来自我的库的调用者,并且可以遍布整个地图——KB 到 MB,甚至可能更大(没有明确的限制)。有什么方法可以从 XmlDocument 中获取一些预期大小的概念? @codesniffer:如果您只关心大小而不关心数据,您可以编写自己的Stream 实现,它会丢弃所有传递的数据,但会对其进行计数。您是否有任何具体理由对此感到担忧,例如来自用户的错误报告?或者您是否试图在潜在问题真正成为问题之前考虑它们?【参考方案3】:

Steve Guidi:谢谢!你的代码是对的!以下是我解决特殊字符问题的方法:

    public static byte[] ConvertToBytes(XmlDocument doc)
    
        Encoding encoding = Encoding.UTF8;
        byte[] docAsBytes = encoding.GetBytes(doc.OuterXml);
        return docAsBytes;
     

【讨论】:

以上是关于如何将 XmlDocument 转换为数组<byte>?的主要内容,如果未能解决你的问题,请参考以下文章

将 xmlDocument 对象数据转换为 pdf

从 XmlDocument 到 XmlReader .Net

WebService 从我的 XmlDocument 中删除 <xml> 标记

XmlDocument 如何将新记录插入现有 XML 文件

c# .net 怎么将一个xml字符串 转换成一个xmlnode ,(不是xmldocument)

XDocument 不会解析 html 实体(例如 ),但 XmlDocument 会