(注意:最初的问题标题是:从带有文档规范的字符串加载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后直接解析字节数组。
答案 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;
}
我想参考其他人提到的较早的帖子,但我不能轻易找到问题的答案,这是我的错,也是因为我不耐烦,因为我刚刚在这里找到答案。