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
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.
Namísto toho použijte metodu Load()
, problém vyřeší. Vidět víc
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.
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
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", "");
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.
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, "");
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;
}