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

Posted

技术标签:

【中文标题】为啥 XML 不能从字符串中读取? (但将来自相同数据的 .text)【英文标题】:why wont XML read from string? (but will from .txt of same data)为什么 XML 不能从字符串中读取? (但将来自相同数据的 .text) 【发布时间】:2011-08-28 18:34:31 【问题描述】:

这是有问题的代码:

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 文件完全匹配。

所以以某种方式将其写入文本文件会删除一些“非法字符”?大家觉得呢?

【问题讨论】:

【参考方案1】:
XmlReader.Create(encoding.GetString(bytes));

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

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

【讨论】:

太棒了,效果很好,谢谢!你有最好的答案!但你们所有人都帮助了谢谢!【参考方案2】:

这里:

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

您只是在调用following method,它接受一个代表文件名的字符串。但是,您将实际的 XML 字符串传递给它,这显然是一个无效的文件名。

如果你想从缓冲区加载阅读器,你可以use a stream:

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

    ...

【讨论】:

感谢您的帮助,但我得到“当前上下文中不存在流”,字符串阅读器工作得更好:) @Csharpz,将using System.IO; 添加到文件顶部,以便将定义MemoryStream 类的命名空间引入其中。 啊,我之前有.IO,然后我删除了它,因为我在摆脱写入文件代码后没有使用它。哪个更快(程序运行速度)?你的方法还是我选择的方法?【参考方案3】:

以单个string 为参数的方法XmlReader.Create() 需要传递一个URI 而不是XML 文档作为字符串,请参考MSDN。它试图打开一个名为“<... uri stream>

【讨论】:

【参考方案4】:

您在期望路径的位置传递 xml 内容,如错误 - illegal characters in path

所示

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

【讨论】:

以上是关于为啥 XML 不能从字符串中读取? (但将来自相同数据的 .text)的主要内容,如果未能解决你的问题,请参考以下文章

为啥来自 xml Web 服务的字符串在 Android TextView 中不显示新行?

如何在java中读取字符串xml字符串?

为啥 Apache Beam BigQueryIO 每次运行都使用相同的 JobId?

为啥不能两次获取相同的数据? NSFetchedResultsController 为空

为啥在使用带有 next() 和 nextLine() 的 Scanner 读取 2 个看似相同的字符串时得到 equals() == false?

为啥编译内核时不能得到相同的符号?