这个问题已经有了答案:
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;
}
我想参考前面别人提到的帖子,但是我在那里找不到我的问题的答案,这是我的错,也是因为我在这里才找到答案而不耐烦。