Подтвердить что ты не робот

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 для синтаксического анализа, чтобы я мог видеть, были ли у меня какие-либо ошибки.

Edit

Этот вопрос не является дубликатом, как отмечено. В этом вопросе человек, задающий вопрос, использовал LoadXml для анализа XML файла. Я разбираю строку, которая является правильным использованием LoadXml

4b9b3361

Ответ 1

Скрытый символ - это, вероятно, спецификация. Объяснение проблемы и решение можно найти здесь, кредиты Джеймсу Шуберту, основанные на ответе Джеймса Бранкина, нашли .

Хотя предыдущий ответ удаляет скрытый символ, он также удаляет всю первую строку. Более точная версия:

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

Я столкнулся с этой проблемой при извлечении XSLT файла из Azure blob и загрузке его в объект XslCompiledTransform. На моей машине файл выглядел просто отлично, но после загрузки его в виде капли и получения его назад был добавлен символ спецификации.

Ответ 2

Вместо этого используйте метод Load(), это решит проблему. Узнать больше

Ответ 3

Проблема заключалась в том, что myString имела эту строку заголовка. Либо был скрытый символ в начале первой строки, либо сама строка вызывала ошибку. Я отрезал первую строку следующим образом:

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

Это решило мою проблему.

Ответ 4

Я думаю, что проблема в кодировании. Поэтому устранение первой строки (с байтом кодирования) может решить проблему.

Мое решение для Данные на корневом уровне недопустимы. Строка 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 byte []. Если вам нужно использовать строку, вы должны искать "невидимые" байты в своей строке и играть с кодировками, чтобы настроить содержимое xml для синтаксического анализа или загрузки.

Надеюсь, что это поможет

Ответ 5

Я решил эту проблему путем непосредственного редактирования байтового массива. Соберите преамбулу UTF8 и удалите непосредственно заголовок. После этого вы можете преобразовать byte [] в строку с помощью метода GetString, см. Ниже. Я тоже удалил, так же, как предосторожность.

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

Ответ 6

Сохраните файл с другой кодировкой:

Файл > Сохранить файл как... > Сохранить как UTF-8 без подписи.

В VS 2017 вы найдете кодировку как раскрывающийся список рядом с кнопкой "Сохранить".

Ответ 7

Если ваш xml находится в строке, используйте следующую команду для удаления любой метки порядка байтов:

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

Ответ 8

Я нашел одно из решений. Для вашего кода это может быть следующим:

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