如何读取二进制数据;(&;#x2;)在xml中使用windows生成的c
本文关键字:windows xml amp 读取 何读取 二进制 数据 #x2 | 更新日期: 2023-09-27 18:27:11
如何使用windows生成的c#读取xml中的二进制数据(;)。我正在尝试访问windows注册表项中的列表。字符串值中弹出二进制数据。我可以使用xml序列化将其序列化为(&;#x2),但我不能将其反序列化?有人能解释一下出了什么问题,为什么?帮我修一下这个。非常感谢:))读取时的错误为:
System.InvalidOperationException未得到处理
消息="XML文档(235,28)中存在错误。"读取自文件:
public diagnostics readregkey(diagnostics diagnostics, string filename)
{
diagnostics dia = null;
using (System.IO.StreamReader sr =
new System.IO.StreamReader(filename, Encoding.Unicode))
{
System.Xml.Serialization.XmlSerializer x =
new System.Xml.Serialization.XmlSerializer(typeof(diagnostics));
dia = x.Deserialize(sr) as diagnostics;
}
return dia;
}
写入文件:
public static void WriteRegKey(diagnostics diagnostics, string filename)
{
diagnostic.regKeys.Add(key(Registry.LocalMachine, sKeyGravitas));
diagnostic.regKeys.Add(key(Registry.CurrentUser, sKeyGravitas));
using (System.IO.StreamWriter sw =
new System.IO.StreamWriter(filename,false, Encoding.Unicode))
{
System.Xml.Serialization.XmlSerializer x =
new System.Xml.Serialization.XmlSerializer(typeof(diagnostics));
x.Serialize(sw, diagnostics);
}
}
XML文件不能表示每个字符,即使使用&#x;
表示法也是如此。
请参阅http://www.w3.org/TR/REC-xml/#charsets
XML 1.1并没有被广泛使用,它可以支持除NUL之外的所有字符。
但对于0x0002,用XML将其表示为
根本不是正确的格式。
处理嵌入式二进制数据的常用方法是将其转换为base-64。
我也遇到了这个问题,为了帮助下一个问题,我把以前解决它的方法留在这里。
正如拉维尼奥所说,XML不能代表每一个字符。因此,我用他提供的表格写了一个方法,与另一个问题中的另一个答案非常相似:https://stackoverflow.com/a/641632/2315604,在序列化之前调用。
private string XmlCharWhiteList(string p)
{
StringBuilder stringBuilder = new StringBuilder();
foreach(char c in p)
{
if (c == 0x0009 || c == 0x000A || c == 0x000D ||
(c >= 0x0020 && c <= 0xD7FF) ||
(c >= 0xE000 && c <= 0xFFFD))
stringBuilder.Append(c);
else
stringBuilder.Append(' ');
}
return stringBuilder.ToString();
}
而且,由于.NET 4.0,您可以使用XmlConvert.IsXmlChar
https://msdn.microsoft.com/en-us/library/system.xml.xmlconvert.isxmlchar%28v=vs.110%29.aspx