为啥 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 中不显示新行?
为啥 Apache Beam BigQueryIO 每次运行都使用相同的 JobId?
为啥不能两次获取相同的数据? NSFetchedResultsController 为空
为啥在使用带有 next() 和 nextLine() 的 Scanner 读取 2 个看似相同的字符串时得到 equals() == false?