提问人:Chris 提问时间:7/23/2013 最后编辑:TylerHChris 更新时间:1/9/2023 访问量:325972
xml.LoadData - 根级别的数据无效。第 1 行,位置 1
xml.LoadData - Data at the root level is invalid. Line 1, position 1
问:
我正在尝试解析 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来解析,这样我就可以看看我是否有任何错误。
答:
这里的问题是有那个标题行。要么是第一行开头有一些隐藏字符,要么是该行本身导致了错误。我像这样切掉了第一行:myString
xml.LoadXml(myString.Substring(myString.IndexOf(Environment.NewLine)));
这解决了我的问题。
评论
改用方法,它将解决问题。查看更多Load()
评论
隐藏字符可能是 BOM。 问题的解释和解决方案可以在这里找到,归功于詹姆斯·舒伯特,基于詹姆斯·布兰金的答案 这里.
虽然前面的答案确实删除了隐藏字符,但它也删除了整个第一行。更精确的版本是:
string _byteOrderMarkUtf8 = Encoding.UTF8.GetString(Encoding.UTF8.GetPreamble());
if (xml.StartsWith(_byteOrderMarkUtf8))
{
xml = xml.Remove(0, _byteOrderMarkUtf8.Length);
}
从 Azure blob 提取 XSLT 文件并将其加载到 XslCompiledTransform 对象中时,我遇到了此问题。 在我的机器上,文件看起来还不错,但是在将其作为 blob 上传并取回后,添加了 BOM 字符。
评论
xmlStartsWith(byteOrderMarkUtf8, StringComparison.Ordinal)
我认为问题出在编码上。这就是为什么删除第一行(带有编码字节)可能会解决问题的原因。
我在根级别对数据的解决方案无效。第 1 行,位置 1。in 将其替换为XDocument.Parse(xmlString)
XDocument.Load( new MemoryStream( xmlContentInBytes ) );
我注意到我的xml字符串看起来没问题:
<?xml version="1.0" encoding="utf-8"?>
但是在不同的文本编辑器编码中,它看起来像这样:
?<?xml version="1.0" encoding="utf-8"?>
最后,我不需要xml字符串,而是xml byte[]。如果需要使用字符串,则应在字符串中查找“不可见”字节,并使用编码来调整用于解析或加载的 xml 内容。
希望会有所帮助
使用不同的编码保存文件:
文件> 将文件另存为...> 另存为 UTF-8,不带签名。
在 VS 2017 中,您可以在“保存”按钮旁边找到编码作为下拉列表。
评论
如果 xml 位于字符串中,请使用以下命令删除任何字节顺序标记:
xml = new Regex("\\<\\?xml.*\\?>").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 方法将 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", "");
评论
如果我们使用的是 XDocument.Parse(@“”)。 使用 @ 可以解决问题。
起初,我在转义“&”字符时遇到了问题,然后变音符号和特殊字母显示为问号,最后出现了 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 等)。查看更多
此错误的主要原因是将数组转换为 .NET 时确定编码的逻辑。Stream
byte[]
string
使用将第二个构造函数参数设置为 true 的 created,将确定正确的编码和 create which 不会破坏方法。StreamReader
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`
}
常见的错误是盲目地在 或 上使用编码。在 Visual Studio 调试器中检查或复制粘贴到某处时,下面的代码将产生看起来有效的代码,但是当与文件一起使用时,或者如果文件的编码方式与没有 BOM 的 UTF8 不同时,它将产生异常。UTF8
stream
byte[]
string
Load
LoadXml
public string GetXmlString(string url)
{
byte[] bytes = GetResponseByteArray(url);
return System.Text.Encoding.UTF8.GetString(bytes); // potentially exception on `LoadXml`
}
使用 XmlDataDocument 对象比使用 XDocument 或 XmlDocument 对象要好得多。XmlDataDocument 适用于 UTF8,并且对字节顺序序列没有问题。可以使用 ChildNodes 属性获取每个元素的子节点。 使用自定义函数,如下所示:
static public void ReadXmlDataDocument2(string xmlFilePath)
{
if (xmlFilePath != null)
{
if (File.Exists(xmlFilePath))
{
System.IO.FileStream fs = default(System.IO.FileStream);
try
{
fs = new System.IO.FileStream(xmlFilePath, System.IO.FileMode.Open, System.IO.FileAccess.Read);
System.Xml.XmlDataDocument k_XDoc = new System.Xml.XmlDataDocument();
k_XDoc.Load(fs);
fs.Close();
fs.Dispose();
fs = null;
XmlNodeList ndsRoot = k_XDoc.ChildNodes;
foreach (System.Xml.XmlNode xLog in ndsRoot)
{
foreach (System.Xml.XmlNode xLog2 in xLog.ChildNodes)
{
if (xLog2.Name == "ERRORs")
{
foreach (System.Xml.XmlNode xLog3 in xLog2.ChildNodes)
{
if (xLog3.Name == "ErrorCode")
{
// Do something
}
if (xLog3.Name == "Description")
{
// Do something
}
}
}
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
}
评论
string
<?xml version="1.0" encoding="utf-8"?>