从具有文档规范(从OpenDocument ODT文件获得)的字节数组或字符串加载XML的最佳方法是什么?

本文关键字:数组 字节数 字节 字符串 加载 是什么 方法 最佳 XML 文档 文件 | 更新日期: 2023-09-27 18:18:57

(注意:最初的问题标题是:从具有文档规范的字符串加载XML的最佳方法是什么?)

我需要从XmlDocument对象中的ODT opendocument (LibreOffice)文件中获取XML内容。ODT是一个zip归档文件,我设法将content.xml部分作为字节数组。转换为字符串似乎很简单,但我惊讶地发现XmlDocument.LoadXml(string)不接受以Xml文档规范行开头的字符串,例如:

<?xml version="1.0" encoding="UTF-8"?>
<Offices id="0" enabled="false">
  <office />
</Offices>

例外是:Data at the root level is invalid. Line 1, position 1

我想知道是否有一个库调用来读取这样的字符串?

现在我使用这个临时的函数,但是在处理xml文档时,必须在字符级别上做一些事情,这感觉没有必要复杂:

    /// <summary>
    /// Convert an Xml document in a string, including document specification line(s),
    /// to an XmlDocument object
    /// </summary>
    /// <param name="XmlString"></param>
    /// <returns></returns>
    public static XmlDocument LoadXmlString(string XmlString)
    {
        XmlDocument XmlDoc = new XmlDocument();
        XmlDoc.LoadXml(XmlString.Substring(XmlString.LastIndexOf("?>") + 2));
        return XmlDoc;
    }

有更好的方法吗?

注意:我指的是前面的问题

,但这解决了解析字符串的问题,通过将字符串转换为字节数组的解决方案,而我不应该解析字符串,也不应该将字节数组转换为字符串,而只是跳过这一步,在解压缩ODT后直接解析字节数组。

从具有文档规范(从OpenDocument ODT文件获得)的字节数组或字符串加载XML的最佳方法是什么?

使用新的、更精确的问题标题,答案可以非常简单:

只是将未压缩的字节数组转换为XML,而不转换为第一个字符串。

简单,没有编码问题的风险。

背景是ODT文件的content.xml部分不是字符串,而是XML文档。LibreOffice将Xml压缩到ODT存档,而没有先将Xml转换为字符串。解压缩函数不知道压缩数据中有什么,它只是将压缩字节解压缩为未压缩字节。XmlDocument.Load()函数不关心字符串表示形式,而是从数据中的文档规范行中学习适用于将字节数组解析为XML的编码。


我原来的回答:

正如我从Donal的(已删除)帖子中了解到的:失败的原因是因为。net字符串用UTF-16编码,而您的规范指定UTF-8。因为我实际上是从一个字节数组开始的,所以我不应该尝试用:

来创建字符串。
  string s = Encoding.UTF8.GetString(Bytes);

因为这个字符串不能被LoadXml()接受。

相反,我需要Donal的解决方案代码,简化为:
    public XmlDocument GetEntryXmlDoc(byte[] Bytes)
    {
        XmlDocument xmlDoc = new XmlDocument();
        using (MemoryStream ms = new MemoryStream(Bytes))
        {
            xmlDoc.Load(ms);
        }
        return xmlDoc;
    }

我想参考别人之前提到的帖子,但我不能很容易地找到我的问题的答案,这是我的错,也因为不耐烦,因为我只是在这里找到了答案。