XDocument无法在C#LINQ中加载版本1.1的xml?

时间:2009-05-26 20:06:53

标签: c# xml linq linq-to-xml

使用版本为1.1而不是1.0的XML文件时,

XDocument.Load会引发异常:

Unhandled Exception: System.Xml.XmlException: Version number '1.1' is invalid. Line 1, position 16.

任何解决错误(没有正则表达式)并加载文档的干净解决方案?

3 个答案:

答案 0 :(得分:5)

最初的反应,只是为了确认我可以重现这个:

using System;
using System.Xml.Linq;

class Test
{   
    static void Main(string[] args)
    {
        string xml = "<?xml version=\"1.1\" ?><root><sub /></root>";
        XDocument doc = XDocument.Parse(xml);
        Console.WriteLine(doc);
    }
}

此例外的结果:

Unhandled Exception: System.Xml.XmlException: Version number '1.1' is invalid. Line 1, position 16.
   at System.Xml.XmlTextReaderImpl.Throw(Exception e)
   at System.Xml.XmlTextReaderImpl.Throw(String res, String arg)
   at System.Xml.XmlTextReaderImpl.ParseXmlDeclaration(Boolean isTextDecl)
   at System.Xml.XmlTextReaderImpl.Read()
   at System.Xml.Linq.XDocument.Load(XmlReader reader, LoadOptions options)
   at System.Xml.Linq.XDocument.Parse(String text, LoadOptions options)
   at System.Xml.Linq.XDocument.Parse(String text)
   at Test.Main(String[] args)

从.NET 4.6开始,它仍然失败。

答案 1 :(得分:5)

“Version 1.0”在标准.NET XML库的各个位置进行了硬编码。例如,您的代码似乎在System.Xml.XmlTextReaderImpl.ParseXmlDeclaration(bool)中违反此行:

 if (!XmlConvert.StrEqual(this.ps.chars, this.ps.charPos, charPos - this.ps.charPos, "1.0"))

我有一个与XDocument.Save类似的问题拒绝保留1.1。它是同一类型的东西 - System.Xml方法中的硬编码“1.0”。

无论如何,我仍然无法找到仍然使用标准库的文件。

答案 2 :(得分:0)

您可以跳过第一行,然后使用 XDocument.Parse 加载 XML。像这样:

                var lines = File.ReadAllLines(xmlFilename).ToList();
                lines[0] = String.Empty;
                var xdoc = XDocument.Parse(string.Join("", lines));