0

我从嵌入在 Windows 窗体中的 Flash 组件接收数据。不幸的是,如果从套接字返回的数据包含以下任何字符,则下面对 loadXml 的调用将失败:

这是我必须从套接字接收数据的回调方法(通过 Flash 组件中的 ExternalInterface)。

private void player_FlashCall(object sender, _IShockwaveFlashEvents_FlashCallEvent e)
{
            String output = e.request;
            //output = CleanInvalidXmlChars(output);
            XmlDocument document = new XmlDocument();
            document.LoadXml(output);

            XmlAttributeCollection attributes = document.FirstChild.Attributes;
            String command = attributes.Item(0).InnerText;              
            XmlNodeList list = document.GetElementsByTagName("arguments");               
            process(list[0].InnerText);

我有一种用文本替换字符的方法(CleanInvalidXmlChars),但我认为这不是正确的方法。

如何将这些数据加载到 XML 文件中,因为这使得分离返回的方法名称、参数名称和参数类型非常容易使用。

将不胜感激任何帮助。

谢谢。

4

1 回答 1

0

如果“XML”包含任何 U+0001(又名 '\x01')或其他类似字符,则它不是有效的 XML。您无法在 XML 中包含这些字符(好吧,无论如何,在 XML 1.0 中)。请参阅XML 规范。如果您需要传递例如XML 中的二进制数据,您需要将它们转换为适当的形式,例如使用Base-64。

如果数据确实包含那些无效字符,则它不是 XML,因此无法使用标准 XML 工具读取(我认为任何标准 .NET 类都不允许您覆盖该行为)。您可以替换所有这些字符(这些基本上都是控制字符(U+0000 到 U+001F),除了 U+0009(制表符)、U+000A 和 U+000D (CR+LF),以及 U+FFFE 和 U +FFFF(非字符))在您尝试使用之前 - 您可以设计一个不会丢失任何数据的安全转换(例如,首先用@0040替换所有@字符,然后用@xxxx替换任何无效字符,其中xxxx是它的代码,并且在处理解析的 XML 数据时,将所有 @xxxx 替换回来)。

另一种选择是放弃 XML 想法并将其作为字符串处理。只是为了获得灵感,请参见例如这段代码

于 2012-09-06T21:09:51.467 回答