Priyank Bolia
Priyank Bolia

Reputation: 14451

XDocument can't load xml with version 1.1 in C# LINQ?

XDocument.Load throws an exception when using an XML file with version 1.1 instead of 1.0:

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

Any clean solutions to resolve the error (without regex) and load the document?

Upvotes: 12

Views: 5294

Answers (3)

Ron
Ron

Reputation: 81

You can just skip the first line, then use XDocument.Parse to load the XML, like this:

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

Upvotes: 1

Jon Skeet
Jon Skeet

Reputation: 1502406

Initial reaction, just to confirm that I can reproduce this:

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);
    }
}

Results in this exception:

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)

It's still failing as of .NET 4.6.

Upvotes: 6

dommer
dommer

Reputation: 19820

"Version 1.0" is hardcoded in various places in the standard .NET XML libraries. For example, your code seems to be falling foul of this line in System.Xml.XmlTextReaderImpl.ParseXmlDeclaration(bool):

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

I had a similar issue with XDocument.Save refusing to retain 1.1. It was the same type of thing - a hardcoded "1.0" in a System.Xml method.

I couldn't find anyway round it that still used the standard libraries.

Upvotes: 5

Related Questions