这个问题已经有了答案:
Why does C# XmlDocument.LoadXml(string) fail when an XML header is included?
9答
(注意:最初的问题标题是:从具有文档规范的字符串加载xml的最佳方式是什么?)
我需要从xmldocument对象中的odt opendocument(libreoffice)文件获取xml内容。odt是一个zip归档文件,我设法将content.xml部分作为字节数组获取。转换成字符串似乎很简单,但我惊讶地发现xml document.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之后直接解析字节数组。

最佳答案

使用新的、更精确的问题标题,答案可以非常简单:
只需将解压缩的字节数组转换为XML,而不必转换为
先系绳子。
简单,没有编码问题的风险。
背景是odt文件的content.xml部分不是字符串,而是一个xml文档。libreoffice将xml压缩到odt归档文件,而没有首先将xml转换为字符串。unzipping函数不知道压缩数据中的内容,只将压缩字节解压缩为未压缩字节。函数的作用是:函数不关心字符串的表示形式,而是从数据中的文档规范行中学习,该行编码适用于将字节数组解析为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;
    }

我想参考前面别人提到的帖子,但是我在那里找不到我的问题的答案,这是我的错,也是因为我在这里才找到答案而不耐烦。

09-10 06:01
查看更多