【问题标题】:XML CDATA error: The element type <X> must be terminated by the matching end-tag </X>XML CDATA 错误:元素类型 <X> 必须由匹配的结束标记 </X> 终止
【发布时间】:2017-05-13 17:46:32
【问题描述】:

我在 XML 提要中收到以下数据:

<imagetag><![CDATA[
http://images.dealer.com/0098/65654e9beaae8aca2eeb7778e723e733x.jpg]
]></imagetag>

我有两个问题:

  1. 当我尝试验证 XML here 时出现错误:The element type "imagetag" must be terminated by the matching end-tag "&lt;/imagetag&gt;".
  2. 我无法找出 (Javascript) 正则表达式来提取 url。我最接近的是:([\s\S]*)&lt;imagetag&gt;&lt;!\[CDATA\[([\s\S]*)\]\]&gt;&lt;\/imagetag&gt;([\s\S]*)。如果在.jpg] 之后没有换行符,这将非常有效,但是有!

我猜这两个问题是相关的,但我不确定原因。任何帮助表示赞赏!

【问题讨论】:

  • 好吧,html/xml 并没有真正的正则表达式,因为它不是 常规语言(不是说它很奇怪,我的意思是它不是 CS 的常规语言定义)。您是否尝试过一些手动解析(看起来很容易子串!)?如果只是 url,我们需要更多示例输入
  • 参见this,仅在无法使用 XML 解析器解析 XML 时使用。
  • ([\s\S]*)&lt;imagetag&gt;&lt;!\[CDATA\[([\s\S]*)\]\s*\]&gt;&lt;\/imagetag&gt;([\s\S]*) 只是使用您的正则表达式,但在正则表达式似乎中断的地方添加\s*。试试这个版本

标签: javascript regex xml cdata


【解决方案1】:

首先,意识到您不需要 CDATA 来表示 XML 中的 URL。

其次,您使用 XML 解析器收到错误的原因是您的数据不是 XML。您的 CDATA 部分格式错误:CDATA 结束标记 CDEnd 中不能有换行符:

[18]    CDSect     ::=      CDStart CData CDEnd
[19]    CDStart    ::=      '<![CDATA['
[20]    CData      ::=      (Char* - (Char* ']]>' Char*))
[21]    CDEnd      ::=      ']]>'

因此,您的 XML 解析器发出错误是完全正确的。

前进的方向是not to try to parse XML via regex(尽管可能会对特定问题进行抽查/修复,例如查找和修复带有嵌入空白的]]&gt;)。前进的方向是修复数据。以下是为正确使用 CDATA 而修复的数据:

<imagetag><![CDATA[
http://images.dealer.com/0098/65654e9beaae8aca2eeb7778e723e733x.jpg
]]></imagetag>

<imagetag><![CDATA[http://images.dealer.com/0098/65654e9beaae8aca2eeb7778e723e733x.jpg]]></imagetag>

重要提示:CDStart 必须是 &lt;![CDATA[CDEnd 必须是 ]]&gt;完全没有换行符。另请注意,]]&gt; 不能出现在 CDATA 部分中; CDATA 部分不能嵌套。

如果您无法修复数据,请拒绝该数据。像 XML 一样处理格式不正确的文本数据是不合适的;它只会使问题长期存在。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-18
    • 1970-01-01
    • 2020-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-18
    相关资源
    最近更新 更多