如何将 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.OuterXml 和 dom.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 到 XmlReader .Net
WebService 从我的 XmlDocument 中删除 <xml> 标记