2009-05-26 2 views
9

XDocument.Load genera un'eccezione quando si utilizza un file XML con la versione 1.1 invece di 1.0:XDocument non può caricare XML con la versione 1.1 in C# LINQ?

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

Eventuali soluzioni pulite per risolvere l'errore (senza regex) e caricare il documento?

+0

Qual è l'eccezione? puoi pubblicare l'xml? – Beatles1692

+0

Verificare la risposta Jon Skeet –

+0

Il ConformanceLevel predefinito è Documento, che in base a MSDN indica che è necessario un documento XML 1.1: http://msdn.microsoft.com/en-us/library/h2344bs2.aspx – user7116

risposta

5

reazione iniziale, solo per confermare che posso riprodurre questo:

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

I risultati in questa eccezione:

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) 

E 'ancora in mancanza come di .NET 4.6.

+1

Il problema è corretto, hai una soluzione pulita (nessuna regex). –

+0

Ho concluso lo stesso ... (anche se non ho controllato 4.0; +1 per sforzi extra) –

+2

Rivedere XmlReader.Create per XmlReaderSettings, ConformanceLevel.Document afferma che è necessario un documento XML 1.0. – user7116

5

"Versione 1.0" è hardcoded in vari punti nelle librerie XML standard standard. Ad esempio, il codice sembra essere di infrangere questa linea in System.Xml.XmlTextReaderImpl.ParseXmlDeclaration (bool):

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

ho avuto un problema simile con XDocument.Save rifiutando di trattenere 1.1. Era lo stesso tipo di cosa: un "1.0" hardcoded in un metodo System.Xml.

Non riuscivo a trovare comunque intorno ad esso che ancora utilizzato le librerie standard.