【问题标题】:Coldfusion - XML formatting a string returned from API callColdfusion - XML 格式化从 API 调用返回的字符串
【发布时间】:2009-11-04 16:50:35
【问题描述】:

我们调用一个返回 XML 格式数据字符串的 API。我们想通过 XMLParse() 将此字符串转换为 ColdFusion XML 对象。当特殊字符出现在数据值中时会出现问题。比如这样的字符:

  — –

(是的,原始数据将它们包含在它们的 HTML 编码等效项中)。在执行 XMLParse() 时,它会在这些编码字符上引发错误。下面是一个会报错的例子:

我们的字符串的一部分: <event>Hello   World</event>

错误: Reference to undefined entity " "

使这些字符与 XMLParse() 兼容的最佳方法是什么?更重要的是 - 如果我们不总是知道角色会是什么,我们怎么能做到这一点?

谢谢!

(这是在 ColdFusion 6 服务器上)

【问题讨论】:

    标签: xml parsing coldfusion special-characters


    【解决方案1】:

    我会推荐:

    ReplaceList(xml, " ,—,–", "#Chr(160)#,#Chr(8212)#,#Chr(8211)#")
    

    维基百科似乎有a quite complete list of character entities 及其字符代码。我会选择使用Chr() 来创建替换字符串,这样您就可以明确且独立于源代码文件编码。

    【讨论】:

    • 唯一的缺点:如果您需要知道某物是实体还是特定字符,则此方法会掩盖该信息。
    • 一个实体和一个特定的角色是同一个东西,只是序列化不同。除非你做错了什么,否则没有必要做出这样的区分。从 DOM 的角度来看,© 就是 ©,无论你是使用 ©&#169© 还是文字 © 在 HTML 源代码中表达它。
    【解决方案2】:
    replace(xml, '&','&','all');
    

    应该允许它被验证。您也可以使用 DTD 来定义这些字符,但正如您所说,您并不总是知道这些字符将是 - 我可能只是进行替换。

    【讨论】:

      【解决方案3】:

      这似乎是一个很好的功能,可以删除扩展字符并将其替换为 HTML 等价物。

      http://www.petefreitag.com/item/202.cfm

      【讨论】:

        【解决方案4】:

        查看这个相关问题:Decode Numeric HTML Entities in ColdFusion?

        使用它,然后使用 XmlFormat(),然后使用 XmlParse()。

        “nbsp 不是 5 个预定义字符实体引用之一”,@stevenerat said

        【讨论】:

          【解决方案5】:

          是的,nbsp 不是预定义的字符实体引用之一,需要使用 xmlformat() 进行转义,例如 xmlparse(xmlformat(theString))。

          http://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references http://livedocs.adobe.com/coldfusion/7/htmldocs/00000668.htm

          【讨论】:

          • theString 上使用XmlFormat() 会将  更改为 。之后您可以 将字符串解析为 XML,但字符串包含的数据将被更改。除此之外,XmlFormat() 会将< 更改为< 等-因此您可以将所有HTML 标记转换为文本。我认为这不是 OP 的意图。
          • Tomalak 是正确的。这改变了原始数据和转换问题。
          【解决方案6】:

          将“&”替换为"&",然后在解析后再次返回似乎可以工作

          <cfsavecontent variable="xmlString">
              <event>Hello&nbsp;World&amp;</event>
          </cfsavecontent>
          <cfset xmlString = Replace(xmlString, "&", "&amp;", "all") />
          <cfset doc = Xmlparse(xmlString) />
          <cfset value = Replace(doc.event.xmlText, "&amp;", "&","all") />
          

          【讨论】:

            【解决方案7】:

            你可以看看XmlFormat()。易于使用:

            <cfset string = XmlFormat(string)>
            

            【讨论】:

            • 这有什么帮助?整个字符串最终会被双重编码,这使得它比以前更不适合 XML 解析。
            • Tomalak 是正确的......这会导致更多的问题,因为 XMLParse() 将挂断这些新字符。
            • 哎呀,是的,这也会转义实体,所以它不再是 XML。下次我会仔细阅读。
            猜你喜欢
            • 1970-01-01
            • 2018-12-29
            • 2011-04-06
            • 2019-12-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多