【问题标题】:Cleanup xml file - Invalid character in the given encoding清理 xml 文件 - 给定编码中的无效字符
【发布时间】:2013-01-22 08:56:52
【问题描述】:

我正在使用他们的“SOAP”API 与 Magento 电子商务集成,API 返回“XML”结果。问题是,这并不总是格式正确:

<product>
   <entity_id>18</entity_id>
   <price regular="2925  <span>Nok</span>"/>
   ...

在这种特定情况下,价格常规属性在属性文本中既有不可见字符 0xa0(在 span 标记之前),又有 。

我似乎无法从 Magento 获得格式正确的 XML,因此替代方法是在将其提供给我的 XmlSerializer 反序列化之前对其进行清理:

XmlSerializer serializer = new XmlSerializer(typeof(Responses.Product.product));
product = serializer.Deserialize(textReader) as Responses.Product.product;

我可以使用简单的文本替换来摆脱不可见的字符,但我更不确定属性文本中的 。

我的问题是,如何将其清理为有效的 XML?

【问题讨论】:

  • 恐怕你拥有的不是XML。这是一个任意字符串。因此,您不能使用 XML 序列化程序来处理它。我建议您从根本上解决问题,在您的情况下是该字符串的生成。所有其他尝试,包括用替换和/或正则表达式清理它最终将把你引向深渊,你的代码总有一天会崩溃。
  • 我不生成这个字符串,它是针对 Magento 的 SOAP 调用的结果。这是我必须使用的,不幸的是我无法修复字符串的提供者:(
  • 不,这不是有效的 SOAP 调用。 SOAP 表示 XML。您在此处显示的内容与所谓的 XML 相去甚远。因此,除非您使用 HttpWebRequest 手动执行此调用并完全忽略您作为 SOAP 协议的响应而得到的错误,否则这不会发生在兼容的 SOAP 客户端上。
  • 好的,所以 Magento 称它为 SOAP 和 XML,不管它是什么。不是我的错 Magento 太垃圾了 :) 不管他们怎么称呼它,这就是我必须使用的。
  • 祝你好运。

标签: c# .net xml magento deserialization


【解决方案1】:

字符 0x3c 是 &lt; 字符。对于不可见的字符,您宁愿寻找像 0x09 TAB 字符这样的东西。

要修复损坏的标记,您可以在内容中查找特定的 HTML 标记,使用正则表达式来允许标记中包含任何货币:

xml = Regex.Replace(xml, "<span>([A-Za-z]{3})</span>", "&lt;span&gt;$1&lt;/span&gt;");

只要在 XML 代码本身中没有任何 span 元素(包含三个字符的内容),此方法就可以工作。您可以对其他 HTML 标记进行类似的替换,但尽量保持模式的具体性,以避免误报。

【讨论】:

  • 对不起,隐形字符是 0xa0,而不是 0x3c。
  • @sphair:啊哈,那是 LF(换行)字符。它在 Linux 和 OS X 中用作换行符。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-09
  • 2014-10-14
  • 1970-01-01
  • 1970-01-01
  • 2019-07-18
  • 1970-01-01
相关资源
最近更新 更多