为什么XML不能从字符串中读取?(但将来自相同数据的.txt)

本文关键字:将来 数据 txt 不能 XML 字符串 读取 为什么 | 更新日期: 2023-09-27 18:07:05

这是有问题的代码:

using (var file = MemoryMappedFile.OpenExisting("AIDA64_SensorValues"))
{
    using (var readerz = file.CreateViewAccessor(0, 0))
    {
        var bytes = new byte[567];
        var encoding = Encoding.ASCII;
        readerz.ReadArray<byte>(0, bytes, 0, bytes.Length);
        File.WriteAllText("C:''myFile.txt", encoding.GetString(bytes));
        var readerSettings = new XmlReaderSettings { ConformanceLevel = ConformanceLevel.Fragment };
        using (var reader = XmlReader.Create("C:''myFile.txt", readerSettings))
        {

这就是myfile.txt的样子:

<sys><id>SCPUCLK</id><label>CPU Clock</label><value>1598</value></sys><sys><id>SCPUFSB</id><label>CPU FSB</label><value>266</value></sys><sys><id>SMEMSPEED</id><label>Memory Speed</label><value>DDR2-667</value></sys><sys><id>SFREEMEM</id><label>Free Memory</label><value>415</value></sys><sys><id>SGPU1CLK</id><label>GPU Clock</label><value>562</value></sys><sys><id>SFREELVMEM</id><label>Free Local Video Memory</label><value>229</value></sys><temp><id>TCPU</id><label>CPU</label><value>42</value></temp><temp><id>TGPU1</id><label>GPU</label><value>58</value></temp>

如果我用将数据写入硬盘驱动器上的txt文件

File.WriteAllText("C:''myFile.txt", encoding.GetString(bytes));

然后使用片段XmlReader:读取相同的文本文件

 XmlReader.Create("C:''myFile.txt");

它读取得很好,程序按照预期运行并完成,但如果我直接用片段XmlReader读取,比如:

XmlReader.Create(encoding.GetString(bytes));

当在XmlReader.Create行上运行"路径中的非法字符"时,我遇到异常。

我试着先把它写到一个单独的字符串中,然后用xmlreader读取它,但试着把它打印到CMD上看它是什么样子是没有帮助的,因为CMD不会显示我正在处理的无效字符,对吧?

但我做了Console.WriteLine(encoding.GetString(bytes));,它与txt文件完全匹配。

那么,以某种方式将其写入文本文件是在删除一些"非法字符"吗?你们觉得怎么样?

为什么XML不能从字符串中读取?(但将来自相同数据的.txt)

XmlReader.Create(encoding.GetString(bytes));

XmlReader.Create()将字符串解释为应该从中读取文件的URI。相反,将您的字节封装在StringReader:中

StringReader sr = new StringReader(encoding.GetString(bytes));
XmlReader.Create(sr);

此处:

XmlReader.Create(encoding.GetString(bytes));

您只需调用以下方法,该方法获取一个表示文件名的字符串。然而,您将实际的XML字符串传递给它,这显然是一个无效的文件名。

如果你想从缓冲区加载阅读器,你可以使用流:

byte[] bytes = ... represents the XML bytes
using (var stream = new MemoryStream(bytes))
using (var reader = XmlReader.Create(stream))
{
    ...
}

以单个string为参数的方法XmlReader.Create()需要传递URI,而不是以字符串形式传递XML文档,请参阅MSDN。它试图打开一个名为"<…"的文件,该文件是一个无效的URI。你可以通过一条溪流。

您将xml内容传递到它期望路径的位置,错误illegal characters in path 证明了这一点

使用适当的过载,并传递流-http://msdn.microsoft.com/en-us/library/system.xml.xmlreader.create.aspx