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

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

谢谢,

【问题讨论】:

    标签: c# .net xml bytearray


    【解决方案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;
        } 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-01
      • 2021-10-20
      • 1970-01-01
      • 2012-05-18
      • 2020-05-17
      • 1970-01-01
      • 2014-03-05
      • 1970-01-01
      相关资源
      最近更新 更多