有人知道为什么下面的代码示例会因为XmlException "Data at the root level is invalid. Line 1, position 1."而失败吗?
var body = "<?xml version="1.0" encoding="utf-16"?><Report> ......"
XmlDocument bodyDoc = new XmlDocument();
bodyDoc.LoadXml(body);
有人知道为什么下面的代码示例会因为XmlException "Data at the root level is invalid. Line 1, position 1."而失败吗?
var body = "<?xml version="1.0" encoding="utf-16"?><Report> ......"
XmlDocument bodyDoc = new XmlDocument();
bodyDoc.LoadXml(body);
虽然你的问题已将编码设置为UTF-16,但你没有正确转义字符串,所以我不确定你是否确实在问题中准确地转录了该字符串。
我遇到了相同的异常:
System.Xml.XmlException: 数据 在根级别处无效。行 1,位置 1。
但是,我的代码如下所示:
string xml = "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<event>This is a Test</event>";
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(xml);
问题在于,在 .NET 中,字符串内部存储为 UTF-16,但是 XML 文档标头中指定的编码可能不同。例如:
<?xml version="1.0" encoding="utf-8"?>
从String的MSDN文档here中可以得知,字符串中的每个Unicode字符都由Unicode标量值定义,也称为Unicode代码点或Unicode字符的序数(数字)值。每个代码点都使用UTF-16编码,并且编码的每个元素的数字值由一个Char对象表示。string xml = "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<event>This is a Test</event>";
// Encode the XML string in a UTF-8 byte array
byte[] encodedString = Encoding.UTF8.GetBytes(xml);
// Put the byte array into a stream and rewind it to the beginning
MemoryStream ms = new MemoryStream(encodedString);
ms.Flush();
ms.Position = 0;
// Build the XmlDocument from the MemorySteam of UTF-8 encoded bytes
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(ms);
ms.Flush()
和 ms.Position = 0
? - Sam Carlson简单而有效的解决方案:不要使用 LoadXml()
方法,而是使用 Load()
方法
例如:
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load("sample.xml");
MemoryStream stream = new MemoryStream();
byte[] data = body.PayloadEncoding.GetBytes(body.Payload);
stream.Write(data, 0, data.Length);
stream.Seek(0, SeekOrigin.Begin);
XmlTextReader reader = new XmlTextReader(stream);
// MSDN reccomends we use Load instead of LoadXml when using in memory XML payloads
bodyDoc.Load(reader);
试试这个:
XmlDocument bodyDoc = new XmlDocument();
bodyDoc.XMLResolver = null;
bodyDoc.Load(body);
这个对我有用:
var xdoc = new XmlDocument { XmlResolver = null };
xdoc.LoadXml(xmlFragment);
这真的帮了我很大的忙。
我基于Zach的回答编写了一个扩展方法,同时我还将其扩展为使用编码作为参数,允许使用不同于UTF-8的编码,并在一个“using”语句中包装了MemoryStream。
public static class XmlHelperExtentions
{
/// <summary>
/// Loads a string through .Load() instead of .LoadXml()
/// This prevents character encoding problems.
/// </summary>
/// <param name="xmlDocument"></param>
/// <param name="xmlString"></param>
public static void LoadString(this XmlDocument xmlDocument, string xmlString, Encoding encoding = null) {
if (encoding == null) {
encoding = Encoding.UTF8;
}
// Encode the XML string in a byte array
byte[] encodedString = encoding.GetBytes(xmlString);
// Put the byte array into a stream and rewind it to the beginning
using (var ms = new MemoryStream(encodedString)) {
ms.Flush();
ms.Position = 0;
// Build the XmlDocument from the MemorySteam of UTF-8 encoded bytes
xmlDocument.Load(ms);
}
}
}
<Window.Resources>
<XmlDataProvider
x:Name="myDP"
x:Key="MyData"
Source=""
XPath="/RootElement/Element"
IsAsynchronous="False"
IsInitialLoadEnabled="True"
debug:PresentationTraceSources.TraceLevel="High" /> </Window.Resources>
m_DataProvider = this.FindResource("MyData") as XmlDataProvider;
FileInfo file = new FileInfo("MyXmlFile.xml");
m_DataProvider.Document = new XmlDocument();
m_DataProvider.Source = new Uri(file.FullName);
我遇到了同样的问题,因为我上传的XML文件是用UTF-8-BOM(UTF-8字节顺序标记)编码的。
在Notepad++中将编码切换为UTF-8后,可以在代码中加载XML文件。
简单的一行代码:
bodyDoc.LoadXml(new MemoryStream(Encoding.Unicode.GetBytes(body)));