it-swarm.dev

لماذا "البيانات على مستوى الجذر غير صالحة. السطر 1 ، الموضع 1." لمستند XML؟

أنا أستخدم طرف ثالث DLL ينقل مستند XML عبر الإنترنت.

لماذا يضع DLL الاستثناء التالي؟

البيانات على مستوى الجذر غير صالح. السطر 1 ، الموضع 1. (انظر أدناه للحصول على نص الاستثناء الكامل.)

فيما يلي الأسطر القليلة الأولى من مستند 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>

الاستثناء:

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:
20
CJ7

أخيرًا ، لاحظت وجود استثناء للبايت وإزالته باستخدام هذا الرمز:

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

يمكنني أن أقدم لك نصيحتين:

  1. يبدو أنك تستخدم "LoadXml" بدلاً من طريقة "Load". في بعض الحالات ، يساعدني.
  2. لديك مشكلة الترميز. هل يمكنك التحقق من تشفير ملف XML وكتابته؟
10
E-Max

أزل كل شيء قبل <?xml version="1.0" encoding="utf-8"?>

في بعض الأحيان ، هناك بعض "غير مرئي" (غير مرئي في جميع برامج تحرير النصوص). بعض البرامج تضيف هذا.

يطلق عليه BOM ، يمكنك قراءة المزيد عن ذلك هنا: https://en.wikipedia.org/wiki/Byte_order_mark#Representations_of_byte_order_marks_by_encoding

2
JedatKinports

إذا كنت تستخدم XDocument.Load(url); لجلب xml من مجال آخر ، فمن المحتمل أن يرفض المضيف الطلب ويعود ونتائج غير متوقعة (غير xml) ، مما ينتج عنه XmlException أعلاه

راجع حل هذا الاحتمال الخاص بي هنا: ترجع XDocument.Load (feedUrl) "البيانات على مستوى الجذر غير صالحة. السطر 1 ، الموضع 1."

0
Adam Hey