it-swarm.dev

xml.LoadData - البيانات على مستوى الجذر غير صالحة. السطر 1 ، الموضع 1

أحاول تحليل بعض XML داخل مثبّت WiX. سيكون XML كائنًا لجميع أخطائي التي تم إرجاعها من خادم ويب. تظهر لي رسالة الخطأ في عنوان السؤال:

XmlDocument xml = new XmlDocument();
try
{
    xml.LoadXml(myString);
}
catch (Exception ex)
{
    System.IO.File.WriteAllText(@"C:\text.txt", myString + "\r\n\r\n" + ex.Message);
    throw ex;
}

myString هذا (كما يظهر في إخراج text.txt)

<?xml version="1.0" encoding="utf-8"?>
<Errors></Errors>

text.txt يظهر بالشكل التالي:

<?xml version="1.0" encoding="utf-8"?>
<Errors></Errors>

Data at the root level is invalid. Line 1, position 1.

أحتاج إلى تحليل XML هذا حتى أتمكن من معرفة ما إذا كان لدي أي أخطاء.

تصحيح

هذا السؤال ليس مكررًا كما هو موضح. في هذا السؤال ، كان الشخص الذي يطرح السؤال يستخدم LoadXml لتحليل ملف XML. أقوم بتحليل سلسلة ، وهو الاستخدام الصحيح لـ LoadXml

57
Chris

الشخصية المخفية هي على الأرجح BOM. يمكن العثور على شرح للمشكلة والحل هنا ، اعتمادات لجيمس شوبرت ، بناءً على إجابة من جيمس برانكين وجدت هنا .

على الرغم من أن الإجابة السابقة تزيل الحرف المخفي ، إلا أنها تزيل السطر الأول بالكامل. الإصدار الأكثر دقة سيكون:

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

واجهت هذه المشكلة عند إحضار ملف XSLT من نقطة أزور وتحميله إلى كائن XslCompiledTransform. على الجهاز الخاص بي ، بدا الملف جيدًا ، ولكن بعد تحميله كنقطة سحب وإعادته ، تمت إضافة حرف BOM.

91
Amit Merin

استخدم طريقة Load() بدلاً من ذلك ، سوف يحل المشكلة. شاهد المزيد

51
Ringo

كانت المشكلة هنا هي أن myString يحتوي على سطر العنوان هذا. إما أن هناك بعض الأحرف المخفية في بداية السطر الأول أو أن السطر نفسه كان يسبب الخطأ. أنا شرائح من السطر الأول مثل ذلك:

xml.LoadXml(myString.Substring(myString.IndexOf(Environment.NewLine)));

هذا حل مشكلتي.

12
Chris

أعتقد أن المشكلة تدور حول الترميز. لهذا السبب قد تؤدي إزالة السطر الأول (مع بايت التشفير) إلى حل المشكلة.

الحل الخاص بي لـ البيانات على مستوى الجذر غير صالح. السطر 1 ، الموضع 1. في XDocument.Parse(xmlString) تم استبداله بـ XDocument.Load( new MemoryStream( xmlContentInBytes ) );

لقد لاحظت أن سلسلة XML لدي تبدو جيدة:

<?xml version="1.0" encoding="utf-8"?>

ولكن في محرر نصوص مختلف ، بدا الأمر كما يلي:

?<?xml version="1.0" encoding="utf-8"?>

في النهاية لم أكن بحاجة إلى سلسلة XML ولكن بايت xml []. إذا كنت بحاجة إلى استخدام السلسلة ، فعليك البحث عن البايتات "غير المرئية" في السلسلة واللعب باستخدام الترميزات لضبط محتوى XML للتحليل أو التحميل.

آمل أن يساعد

8
pawciu

لقد حللت هذه المشكلة عن طريق تحرير صفيف البايت مباشرة. جمع ديباجة UTF8 وإزالة الرأس مباشرة. بعد ذلك ، يمكنك تحويل البايتة [] إلى سلسلة بأسلوب GetString ، انظر أدناه.\r و\t لقد قمت بإزالتها أيضًا ، تمامًا كإجراء احترازي.

XmlDocument configurationXML = new XmlDocument();
List<byte> byteArray = new List<byte>(webRequest.downloadHandler.data);

foreach(byte singleByte in Encoding.UTF8.GetPreamble())
{
     byteArray.RemoveAt(byteArray.IndexOf(singleByte));
}
string xml = System.Text.Encoding.UTF8.GetString(byteArray.ToArray());
       xml = xml.Replace("\\r", "");
       xml = xml.Replace("\\t", "");
2
Michael Planer

احفظ ملفك بترميز مختلف:

ملف> حفظ الملف باسم ...> حفظ كـ UTF-8 بدون توقيع.

في VS 2017 ، تجد الترميز كقائمة منسدلة بجوار الزر "حفظ".

1
MikeMajara

إذا كان xml في سلسلة ، استخدم ما يلي لإزالة أي علامة ترتيب بايت:

        xml = new Regex("\\<\\?xml.*\\?>").Replace(xml, "");
0
Mister Cook

لقد وجدت واحدة من الحلول. لرمزك هذا يمكن أن يكون على النحو التالي -

XmlDocument xml = new XmlDocument();
try
{
    // assuming the location of the file is in the current directory 
    // assuming the file name be loadData.xml
    string myString = "./loadData.xml";
    xml.Load(myString);
}
catch (Exception ex)
{
    System.IO.File.WriteAllText(@"C:\text.txt", myString + "\r\n\r\n" + ex.Message);
    throw ex;
}
0
Shubhasish Bhunia