2013-07-30 16 views
17

Używam biblioteki DLL innej firmy, która przesyła dokument XML przez Internet.Dlaczego "Dane na poziomie katalogu głównego są nieprawidłowe. Linia 1, pozycja 1." dla dokumentu XML?

Dlaczego DLL powinien rzucić następujący wyjątek?

Dane na poziomie katalogu głównego są nieprawidłowe. Linia 1, pozycja 1. (patrz poniżej pełnego tekstu wyjątku.)

Oto kilka pierwszych linii dokumentu 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> 

Wyjątek:

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

W jaki sposób plik xml jest przesyłany przez Internet? HTTP? Jeśli tak, sprawdź, czy a) plik ma zestawienie komponentów, oraz b) nagłówek HTTP określa zestaw znaków innych niż UTF8. –

Odpowiedz

10

Mogę podać dwie porady:

  1. Wygląda na to, że używasz "LoadXml" zamiast metody "Load". W niektórych przypadkach to mi pomaga.
  2. Masz problem z kodowaniem. Czy możesz sprawdzić kodowanie pliku XML i napisać go?
+0

Właśnie zobaczyłem komentarz. Tak, spróbuj ustawić kodowanie pliku na UTF8-WITHOUT-BOM –

+0

Opcja 1 działa dla mnie. – BENN1TH

35

I w końcu zorientowali się, że był to wyjątek znak bajt i usunięto go za pomocą tego kodu:

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

To działało idealnie w mojej sytuacji – Ian1971

+0

dzięki, to był mój problem. – MushyPeas

+0

To jest zerowa grupa znaków - musiałem użyć xml = xml.Remove (0, _byteOrderMarkUtf8.Length-1); –

0

miałem podobny problem parsowania ciąg znaków XML, który rozpoczął jako "<?xml version=\"1.0\" encoding=\"utf-16\"?>\n...

Ja tylko wymienić wszystkie śmieszne znaki następująco :

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;", "/");