【发布时间】:2011-08-26 03:13:41
【问题描述】:
所以这是代码片段:
static void Main(string[] args)
{
Console.WriteLine("Memory mapped file reader started");
using (var file = MemoryMappedFile.OpenExisting("AIDA64_SensorValues"))
{
using (var reader = file.CreateViewAccessor())
{
var bytes = new byte[3388];
var encoding = Encoding.ASCII;
XmlDocument document = new XmlDocument();
document.LoadXml("<root>" + encoding.GetString(bytes) + "</root>");
XmlNode node = document.DocumentElement.SelectSingleNode("//value");
Console.WriteLine("node = " + node);
}
}
Console.WriteLine("Press any key to exit ...");
Console.ReadLine();
}
它从共享内存(snipit)中读取这样的信息:
<sys><id>SCPUCLK</id><label>CPU Clock</label><value>2930</value></sys><sys><id>SCPUMUL</id><label>CPU Multiplier</label><value>11.0</value></sys>
并读取所有<value></value> 中的值,然后将其打印出来。
但它工作不正常,我得到无效字符“。”运行时异常。
所以我尝试更改“新字节[3388];”没有<root></root> 的字符串的整个长度是 3388(打印到 HDD 上的 TXT 文件以找出答案)所以我添加了 13 并得到了 3401(因为这就是根标签的长度,我必须添加它来修复多个根错误)
但我似乎仍然收到关于“'。'的错误,十六进制值 0x00,是一个无效字符。第 1 行,位置 7。”
谢谢
【问题讨论】:
-
你好像没有使用
reader。 -
document.LoadXml("
" + encoding.GetString(bytes) + " ");在这一行中,您究竟是如何填充字节数据的?我的意思是在您显示的代码中,字节被声明,但根本没有填满? -
为什么需要内存映射文件?不需要从 XML 文件中读取大约 3K 字节。
-
这是从 Windows 系统监控应用程序中提取的,这就是他们将数据存储为共享内存中的 xml ish 格式文件的方式,我知道这很糟糕。
-
encoding.GetString(bytes) 我相信这是 zenwalker 的答案,添加根标签是因为 xml 没有主根,只有多个根(您可以在输入 xml 中看到多个根作为
) 添加根标签修复了我在程序运行时遇到的错误(xmlnode 行上的多个根异常),现在我有了这个。