C# xml.LoadData-根级别的数据无效。第1行,位置1
我试图在WiX安装程序中解析一些XML。XML将是我从web服务器返回的所有错误的对象。我得到了问题标题中的错误代码:C# xml.LoadData-根级别的数据无效。第1行,位置1,c#,xml,xml-parsing,wix,C#,Xml,Xml Parsing,Wix,我试图在WiX安装程序中解析一些XML。XML将是我从web服务器返回的所有错误的对象。我得到了问题标题中的错误代码: 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
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,以便查看是否有任何错误
编辑
这个问题不是重复的。在这个问题中,提问者使用
LoadXml
解析XML文件。我正在解析一个字符串,这是LoadXml
的正确用法。这里的问题是myString
有那个标题行。要么在第一行的开头有隐藏字符,要么是该行本身导致了错误。我把第一行切成这样:
xml.LoadXml(myString.Substring(myString.IndexOf(Environment.NewLine)));
这解决了我的问题。使用
Load()
方法,它将解决问题 隐藏的字符可能是BOM。
根据詹姆斯·布兰金(James Brankin)的答案,可以找到问题的解释和解决方案,这要归功于詹姆斯·舒伯特(James Schubert)
虽然前面的答案确实删除了隐藏字符,但它也删除了整个第一行。更精确的版本是:
string _byteOrderMarkUtf8 = Encoding.UTF8.GetString(Encoding.UTF8.GetPreamble());
if (xml.StartsWith(_byteOrderMarkUtf8))
{
xml = xml.Remove(0, _byteOrderMarkUtf8.Length);
}
我从Azure blob获取XSLT文件并将其加载到XslCompiledTransform对象时遇到了这个问题。
在我的机器上,这个文件看起来很好,但是在作为一个blob上传并取回它之后,添加了BOM字符 我认为问题在于编码。这就是为什么删除第一行(带有编码字节)可能会解决问题的原因 我对根级别的数据的解决方案无效。第1行,位置1。 在
XDocument.Parse(xmlString)
中,将其替换为XDocument.Load(newmemorystream(xmlContentInBytes))代码>
我注意到我的xml字符串看起来很正常:
<?xml version="1.0" encoding="utf-8"?>
但在不同的文本编辑器编码中,它看起来是这样的:
<?xml version="1.0" encoding="utf-8"?>
<Errors></Errors>
Data at the root level is invalid. Line 1, position 1.
?<?xml version="1.0" encoding="utf-8"?>
?
最后,我不需要xml字符串,而是需要xml字节[]。如果需要使用字符串,应该在字符串中查找“不可见”字节,并使用编码调整xml内容以进行解析或加载
希望它能帮助您使用不同的编码保存文件:
文件>将文件另存为…>另存为不带签名的UTF-8
在VS 2017中,您可以在“保存”按钮旁边找到“编码”下拉列表。如果您的xml位于字符串中,请使用以下命令删除任何字节顺序标记:
xml = new Regex("\\<\\?xml.*\\?>").Replace(xml, "");
xml=newregex(\\”).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;
}
我通过直接编辑字节数组解决了这个问题。
收集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", "");
XmlDocument configurationXML=new XmlDocument();
List byteArray=新列表(webRequest.downloadHandler.data);
foreach(编码中的单字节.UTF8.GetPreamble())
{
byteArray.RemoveAt(byteArray.IndexOf(单字节));
}
stringxml=System.Text.Encoding.UTF8.GetString(byteArray.ToArray());
xml=xml.Replace(“\\r”和“”);
xml=xml.Replace(“\\t”,”);
如果我们使用的是XDocument.Parse(@“”)。
使用@it解决问题 起初,我很难摆脱“&”这个字符,然后变音符号和特殊字母被显示为问号,最后出现了上面提到的问题
我查看了答案,并使用@Ringo的建议尝试使用Load()方法作为替代方法。这让我意识到,我可以用其他方式处理我的回应,而不仅仅是作为一个字符串
使用System.IO.Stream而不是字符串为我解决了所有问题
var response = await this.httpClient.GetAsync(url);
var responseStream = await response.Content.ReadAsStreamAsync();
var xmlDocument = new XmlDocument();
xmlDocument.Load(responseStream);
Load()的酷之处在于,该方法自动检测输入XML的字符串格式(例如,UTF-8、ANSI等) 此错误的罪魁祸首是将流
或字节[]转换为.NET字符串时确定编码的逻辑
使用第二个构造函数参数detectEncodingFromByteOrderMarks
设置为true时创建的StreamReader
,将确定正确的编码并创建不会中断XmlDocument.LoadXml
方法的string
公共字符串GetXmlString(字符串url)
{
使用var stream=GetResponseStream(url);
使用var reader=newstreamreader(stream,true);
返回reader.ReadToEnd();//在`LoadXml上没有异常`
}
常见的错误是在流
或字节[]
上盲目使用UTF8
编码。下面的代码将生成字符串
,当在Visual Studio调试器中检查时,该字符串看起来有效,或者复制粘贴到某个位置,但是当与加载
或加载XML
一起使用时,如果文件的编码与不带BOM的UTF8不同,则会生成异常
公共字符串GetXmlString(字符串url)
{
字节[]字节=GetResponseByteArray(url);
return System.Text.Encoding.UTF8.GetString(字节);//在`LoadXml上可能出现异常`
}
确实需要查看xml来帮助我将其添加到问题中,但它已经在text.txt
@JohnSaunders的输出中-它不是该问题的重复。在这个问题中,提出问题的人使用LoadXml解析XML文件。我正在解析一个字符串,这是LoadXml
@marc\s的正确用法:string
真的可以是UTF-8吗?如果在加载之前删除了处理指令(第一行),该怎么办?如果我获取您的代码并编译并运行它,就不会出现错误。但那可能是因为我把我的字符串硬编码了。你的myString是如何设置的?如果它来自另一个文件或流,可能会有一些烦人的东西,比如字节Ord
var response = await this.httpClient.GetAsync(url);
var responseStream = await response.Content.ReadAsStreamAsync();
var xmlDocument = new XmlDocument();
xmlDocument.Load(responseStream);