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

标签 c# xml xmldocument odt

<分区>

(注意:最初的问题标题是:从具有文档规范的字符串加载 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>

异常(exception)情况是:根级别的数据无效。第 1 行,位置 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;
    }

有没有更好的办法?

注意:我指的是 this earlier question

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

最佳答案

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

just convert the unzipped byte array to XML without converting to a string first.

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

背景是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;
    }

我想引用别人之前提到的帖子,但是我在那里找不到我的问题的答案,这是我的错,也是因为我在这里找到答案的不耐烦。

关于c# - 从 OpenDocument ODT 文件获得的具有文档规范的字节数组或字符串加载 XML 的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25431991/

相关文章:

c# - 进行 WCF 服务调用的单元测试方法?

Java 将 NodeList 转换为 String 以检查 xml 注释

.net - XmlDocument.LoadXml() 挂了几分钟

c# - Timer 中的客户端脚本不工作

c# - 应用程序启动检查,我应该在 MVVM 模式中的什么地方执行它们?

Java、XML,还是两者兼而有之?

java - JAXB:编码的 XML 中缺少具体类型信息 (xsi:type)

xml - Fluent NHibernate 和 XML 列

c# 使用命名空间解析 xml

javascript - 如何从后面的代码中分配 $(document).ready 中的值