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

时间:2014-08-21 17:05:27

标签: 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>

例外情况是: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;
    }

有更好的方法吗?

注意:我引用this earlier question

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

1 个答案:

答案 0 :(得分: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;
    }

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