it-swarm.dev

xml.LoadData - Data na úrovni kořenového adresáře jsou neplatná. Řádek 1, poloha 1

Snažím se analyzovat XML uvnitř instalátoru WiX. XML by byl předmětem všech mých chyb vrácených z webového serveru. Chyba v názvu otázky s tímto kódem:

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 je toto (jak je vidět ve výstupu text.txt)

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

text.txt vychází takto:

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

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

Potřebuji tento XML analyzovat, takže uvidím, jestli jsem měl nějaké chyby.

Upravit

Tato otázka není duplikátem označeným. V této otázce osoba, která žádá o otázku, použila LoadXml k analýze souboru XML. Analyzuji řetězec, který je správným použitím LoadXml

53
Chris

Skrytá postava je pravděpodobně kusovník. Vysvětlení problému a řešení lze nalézt zde , kredity Jamesovi Schubertovi, založené na odpovědi Jamese Brankina nalezené zde

Ačkoliv předchozí odpověď odstraní skrytý znak, odstraní také celý první řádek. Přesnější verze by byla:

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

S tímto problémem jsem se setkal při načítání souboru XSLT z bloku Azure a jeho načtení do objektu XslCompiledTransform. Na mém počítači soubor vypadal v pořádku, ale po nahrání jako blob a načtení zpět byl znak kusovníku přidán. 

86
Amit Merin

Namísto toho použijte metodu Load(), problém vyřeší. Vidět víc

50
Ringo

Problém zde byl, že myString měla ten řádek záhlaví. Buď byl na začátku prvního řádku nějaký skrytý znak nebo chyba způsobovala samotnou čáru. Odřízl jsem první řádek takto:

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

To vyřešilo můj problém.

12
Chris

Myslím, že problém je o kódování. To je důvod, proč odstranění prvního řádku (s kódováním byte) může problém vyřešit.

Moje řešení pro Data na úrovni kořenového adresáře je neplatné. Řádek 1, pozice 1. V XDocument.Parse(xmlString) byl nahrazen XDocument.Load( new MemoryStream( xmlContentInBytes ) );

Všiml jsem si, že můj řetězec XML vypadal dobře:

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

ale v jiném textovém editoru to vypadalo takto:

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

Nakonec jsem nepotřeboval xml řetězec, ale xml byte []. Pokud potřebujete použít řetězec, měli byste hledat "neviditelné" bajty ve vašem řetězci a hrát s kódováním pro úpravu obsahu XML pro analýzu nebo načítání.

Doufám, že to pomůže

8
pawciu

Tento problém jsem vyřešil přímo úpravou bajtového pole. Sbírejte preambuli UTF8 a odeberte přímo záhlaví. Poté můžete bajt [] převést na řetězec s metodou GetString, viz níže R a já jsem také odstranil, stejně jako preventivní opatření.

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

Uložte soubor s jiným kódováním:

Soubor> Uložit soubor jako ...> Uložit jako UTF-8 bez podpisu.

Ve VS 2017 najdete kódování jako rozevírací tlačítko vedle tlačítka Uložit.

1
MikeMajara

Pokud je váš XML v řetězci, použijte následující příkaz k odstranění libovolné značky bajtové objednávky:

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

Zjistil jsem jedno z řešení. Pro váš kód to může být následující -

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