Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从OpenDocument ODT文件获得的具有文档规范的字节数组或字符串加载XML的最佳方法是什么?_C#_Xml_Xmldocument_Odt - Fatal编程技术网

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

C# 从OpenDocument ODT文件获得的具有文档规范的字节数组或字符串加载XML的最佳方法是什么?,c#,xml,xmldocument,odt,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"?>

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

注:我指的是


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

使用新的更精确的问题标题,答案很简单:

只需将解压缩的字节数组转换为XML,而无需转换为 先拉绳子

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

背景是ODT文件的content.xml部分不是字符串,而是xml文档。LibreOffice将Xml压缩到ODT归档,而不首先将Xml转换为字符串。解压函数不知道压缩后的数据中有什么,只是将压缩的字节解压为未压缩的字节。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;
    }

我想参考其他人之前提到的帖子,但我在那里很难找到问题的答案,这是我的错,也是因为我不耐烦,因为我刚刚在这里找到了答案。

可以,你的
xmlString
有问题。我刚刚在VS中尝试了您的XML字符串,它工作了。您尝试过Linq to XML吗?i、 e.不完全是,前面的问题回答得相当复杂,至少下面的答案对我来说非常有用,我至少可以选择将其标记为答案或对其进行评论,因此请解锁此问题。@Roland,没有人锁定此问题,您最好将其删除,因为你的代码没有问题。我在回答部分中发布的示例是因为我不能在注释中放置这么多代码。如果在<<代码>中使用考虑“代码>内存流< /代码>,您的答案将得到改善。block@Habib同意,但这可能是离题了。这个问题的问题是编码问题,这在我最初的代码发布中是不可见的。Donal的解决方案不进行任何编码,只是将字节转换为XML,其中字节包括XML文档规范行中的编码细节。我可能可以进一步简化一步,因为我可以从CSharpZipLib的流中获取字节,我可以直接输入Load(),我发现我甚至可以简化一步,因为我可以从CSharpZipLib的流中获取字节,我可以直接输入Load()。我现在更加感谢多纳尔(被删除的)贡献。这个答案取自
    public XmlDocument GetEntryXmlDoc(byte[] Bytes)
    {
        XmlDocument xmlDoc = new XmlDocument();
        using (MemoryStream ms = new MemoryStream(Bytes))
        {
            xmlDoc.Load(ms);
        }
        return xmlDoc;
    }