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

时间:2013-07-22 18:50:44

标签: 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 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

的正确用法

11 个答案:

答案 0 :(得分:93)

隐藏的角色可能是BOM。 根据詹姆斯·布兰金发现here的答案,可以找到问题和解决方案的解释here,詹姆斯舒伯特的信用。

虽然上一个答案确实删除了隐藏的字符,但它也删除了整个第一行。更准确的版本是:

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 :(得分:52)

使用Load()方法,它将解决问题。 See more

答案 2 :(得分:12)

这里的问题是myString有标题行。要么在第一行的开头有一些隐藏的字符,要么行本身导致错误。我像这样切掉了第一行:

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

这解决了我的问题。

答案 3 :(得分:8)

我认为问题在于编码。这就是为什么删除第一行(带编码字节)可能会解决问题。

我的解决方案根级别的数据无效。第1行,第1位。 XDocument.Parse(xmlString)中的XDocument.Load( new MemoryStream( xmlContentInBytes ) );替换为<?xml version="1.0" encoding="utf-8"?>

我注意到我的xml字符串看起来没问题了:

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

但是在不同的文本编辑器编码中,它看起来像这样:

easy_mode = raw_input("Let's start a new game. Do you want to play right away? The number of battleships will be randomized, as well as their size (y/n)");
if easy_mode.lower() == 'yes':

最后我不需要xml字符串而是xml byte []。如果你需要使用字符串,你应该在字符串中查找“不可见”字节并使用编码来调整xml内容以进行解析或加载。

希望它会有所帮助

答案 4 :(得分:2)

我已经通过直接编辑字节数组解决了这个问题。 收集UTF8前同步码并直接删除标头。 之后,您可以使用GetString方法将byte []转换为字符串,请参见下文。 为了预防起见,我也删除了\ 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", "");

答案 5 :(得分:2)

起初,我在转义“&”字符时遇到问题,然后将变音符号和特殊字母显示为问号,最后出现了提到的OP问题。

我查看了答案,并使用@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等)。 See more

答案 6 :(得分:1)

使用不同的编码保存文件:

档案&gt;将文件另存为...&gt;保存为UTF-8,无需签名。

在VS 2017中,您可以在“保存”按钮旁边找到编码作为下拉列表。

答案 7 :(得分:0)

如果您的xml在字符串中,请使用以下命令删除任何字节顺序标记:

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

答案 8 :(得分:0)

我找到了一种解决方案。 对于您的代码,可能如下所示-

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;
}

答案 9 :(得分:0)

如果我们正在使用XDocument.Parse(@“”)。 使用@可以解决问题。

答案 10 :(得分:0)

此错误的主要原因是逻辑,该逻辑确定将Streambyte[]数组转换为.NET string时的编码。

使用将第二个构造函数参数StreamReader设置为true创建的detectEncodingFromByteOrderMarks,可以确定正确的编码并创建string,而不会破坏XmlDocument.LoadXml方法。

public string GetXmlString(string url)
{
    using var stream = GetResponseStream(url);
    using var reader = new StreamReader(stream, true);
    return reader.ReadToEnd(); // no exception on `LoadXml`
}

常见的错误是仅在UTF8stream上盲目使用byte[]编码。下面的代码将产生string,当在Visual Studio调试器中检查该代码时看起来有效,或者复制粘贴到某个地方,但是如果文件的编码方式不同,则与LoadLoadXml一起使用时,它将产生异常。然后是没有BOM的UTF8。

public string GetXmlString(string url)
{
    byte[] bytes = GetResponseByteArray(url);
    return System.Text.Encoding.UTF8.GetString(bytes); // potentially exception on `LoadXml`
}