2013-07-30 26 views
17

Sto utilizzando una DLL di terze parti che trasmette un documento XML su Internet.Perché "I dati al livello principale non sono validi. Linea 1, posizione 1." per documento XML?

Perché la DLL genera la seguente eccezione?

I dati al livello root non sono validi. Linea 1, posizione 1. (vedi sotto per testo completo eccezione.)

Ecco le prime righe del documento XML:

<?xml version="1.0" encoding="utf-8"?> <REQUEST> <HEADER> 
    <REQUESTID>8a5f6d56-d56d-4b7b-b7bf-afcf89cd970d</REQUESTID> 
    <MESSAGETYPE>101</MESSAGETYPE> 
    <MESSAGEVERSION>3.0.2</MESSAGEVERSION> 

Eccezione:

System.ApplicationException was caught 
     Message=Unexpected exception. 
     Source=FooSDK 
     StackTrace: 
      at FooSDK.RequestProcessor.Send(String SocketServerAddress, Int32 port) 
      at Foo.ExecuteRequest(Int32 messageID, IPayload payload, Provider prov) 
      at Foo.SendOrder(Int32 OrderNo) 
     InnerException: System.Xml.XmlException 
      LineNumber=1 
      LinePosition=1 
      Message=Data at the root level is invalid. Line 1, position 1. 
      Source=System.Xml 
      SourceUri="" 
      StackTrace: 
       at System.Xml.XmlTextReaderImpl.Throw(Exception e) 
       at System.Xml.XmlTextReaderImpl.Throw(String res, String arg) 
       at System.Xml.XmlTextReaderImpl.ParseRootLevelWhitespace() 
       at System.Xml.XmlTextReaderImpl.ParseDocumentContent() 
       at System.Xml.XmlTextReaderImpl.Read() 
       at System.Xml.XmlLoader.Load(XmlDocument doc, XmlReader reader, Boolean preserveWhitespace) 
       at System.Xml.XmlDocument.Load(XmlReader reader) 
       at System.Xml.XmlDocument.LoadXml(String xml) 
       at XYZ.RequestProcessor.GetObjectFromXML(String xmlResult) 
       at XYZ.RequestProcessor.Send(String SocketServerAddress, Int32 port) 
      InnerException: 
+1

Come viene trasmesso il file xml su Internet? HTTP? In tal caso, controlla se a) il file ha una distinta base e b) l'intestazione HTTP specifica anche un set di caratteri non UTF8. –

risposta

10

Posso darti due consigli:

  1. Sembra che si stia utilizzando "LoadXml" invece di "Load". In alcuni casi, mi aiuta.
  2. Hai un problema di codifica. Potresti controllare la codifica del file XML e scriverlo?
+0

Ho appena visto il commento. Sì, prova a impostare la codifica del file su UTF8-WITHOUT-BOM –

+0

L'opzione 1 ha funzionato per me. – BENN1TH

35

Alla fine ho capito che c'era un un'eccezione marchio di byte e rimosso utilizzando questo codice:

string _byteOrderMarkUtf8 = Encoding.UTF8.GetString(Encoding.UTF8.GetPreamble()); 
    if (xml.StartsWith(_byteOrderMarkUtf8)) 
    { 
     var lastIndexOfUtf8 = _byteOrderMarkUtf8.Length-1; 
     xml = xml.Remove(0, lastIndexOfUtf8); 
    } 
+0

Questo ha funzionato perfettamente nella mia situazione – Ian1971

+0

grazie, quello era il mio problema. – MushyPeas

+0

Questo è un array di caratteri zerobased: dovevo usare xml = xml.Remove (0, _byteOrderMarkUtf8.Length-1); –

0

Ho avuto un problema simile il parsing di una stringa XML che è iniziato come "<?xml version=\"1.0\" encoding=\"utf-16\"?>\n...

Tutto quello che ho fatto è stato di sostituire tutti i caratteri divertenti come segue :

var xmlData = [myvariable].GetElementsByTagName("[SpecifiedNode]")[0].InnerText.Replace("\n", "").Replace("<?xml version=\"1.0\" encoding=\"utf-16\"?>", "").Replace("<string>", "").Replace("\\", "").Replace("</string>", "").Replace("&lt;", "<").Replace("&gt;", ">").Replace("&amp;", "/");