2

(注意:最初的问题标题是:从带有文档规范的字符串中加载 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 后解析字节数组。

4

1 回答 1

5

有了新的、更精确的问题标题,答案可能非常简单:

只需将解压缩的字节数组转换为 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;
    }

我想参考其他人提到的较早的帖子,但是我在那里无法轻易找到我的问题的答案,这是我的错,也是因为我刚刚在这里找到了答案,所以不耐烦。

于 2014-08-21T17:41:20.493 回答