2009-05-26 11 views
9

XDocument.Load wirft eine Ausnahme, wenn eine XML-Datei mit der Version 1.1 statt 1.0 mit:XDocument kann XML mit Version 1.1 in C# LINQ nicht laden?

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

jede saubere Lösungen, um den Fehler zu beheben (ohne reguläre Ausdrücke) und das Dokument laden?

+0

Was ist die Ausnahme? Kannst du das XML hochladen? – Beatles1692

+0

Überprüfen Sie die Jon Skeet Antwort –

+0

Die Standard ConformanceLevel ist Dokument, das laut MSDN angibt, dass es ein XML 1.1-Dokument benötigt: http://msdn.microsoft.com/en-us/library/h2344bs2.aspx – user7116

Antwort

5

Der erste Reaktion, nur um zu bestätigen, dass ich das wiedergeben kann:

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

Ergebnisse in dieser Ausnahme:

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) 

Es ist immer noch wie von .NET 4.6 scheitern.

+1

Das Problem ist richtig, hast du eine saubere Lösung (keine Regex). –

+0

Ich schloß das gleiche ... (obwohl ich 4.0 nicht überprüft habe; +1 für zusätzlichen Aufwand) –

+2

Reviewing XmlReader.Create für die XmlReaderSettings, ConformanceLevel.Document besagt, dass es ein XML 1.0-Dokument benötigt. – user7116

5

"Version 1.0" ist an verschiedenen Stellen in den Standard-.NET-XML-Bibliotheken fest codiert. Zum Beispiel scheint Ihr Code Foul von dieser Linie in System.Xml.XmlTextReaderImpl.ParseXmlDeclaration (bool) zu fallen:

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

hatte ich ein ähnliches Problem mit XDocument.Save Verweigerung 1,1 zu halten. Es war die gleiche Art von Sache - eine hardcoded "1.0" in einer System.Xml-Methode.

Ich konnte sowieso nicht finden, dass es immer noch die Standard-Bibliotheken verwendet.