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 + "rnrn" + 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
8 ответов
скрытый символ, вероятно, является BOM. Объяснение проблемы и решение можно найти здесь, кредиты на Джеймса Шуберта, в зависимости от ответа Джеймс Brankin нашел здесь.
хотя предыдущий ответ удаляет скрытый символ, он также удаляет всю первую строку. Более точная версия была бы:
string _byteOrderMarkUtf8 = Encoding.UTF8.GetString(Encoding.UTF8.GetPreamble());
if (xml.StartsWith(_byteOrderMarkUtf8))
{
xml = xml.Remove(0, _byteOrderMarkUtf8.Length);
}
я столкнулся с этой проблемой при извлечении файла XSLT из Azure blob и загрузке его в Объект XslCompiledTransform. На моей машине файл выглядел просто отлично, но после загрузки его как blob и возврата его, был добавлен символ BOM.
использовать Load()
метод вместо этого, он решит проблему. Посмотреть подробнее
проблема здесь была в том, что myString
была эта строка заголовка. Либо в начале первой строки был какой-то скрытый символ, либо сама строка вызывала ошибку. Я отрезал первую строчку вот так:--3-->
xml.LoadXml(myString.Substring(myString.IndexOf(Environment.NewLine)));
это решило мою проблему.
Я думаю, что проблема заключается в кодировании. Вот почему удаление первой строки (с байтом кодирования) может решить проблему.
мое решение для данные на корневом уровне, является недействительным. Строка 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 для синтаксического анализа или загрузки.
надеюсь, это поможет
Я решил эту проблему, непосредственно отредактировав массив байтов. Соберите преамбулу UTF8 и удалите непосредственно заголовок. После этого вы можете преобразовать byte[]в строку с помощью метода 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", "");
сохраните файл с другой кодировкой:
Файл > Сохранить файл как... > Сохранить как UTF-8 без подписи.
в VS 2017 вы найдете кодировку в виде выпадающего списка рядом с кнопкой Сохранить.
Если ваш xml находится в строке, используйте следующее, Чтобы удалить любую метку порядка байтов:
xml = new Regex("\<\?xml.*\?>").Replace(xml, "");
Я нашел одно из решений. Для вашего кода, это может быть следующим образом -
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;
}