C# xml.LoadData-根级别的数据无效。第1行,位置1

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

我试图在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 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);