XML CDATA错误:元素类型<x>必须由匹配的结束标记</x>终止

时间:2017-05-13 17:46:32

标签: javascript regex xml cdata

我在XML Feed中收到以下数据:

<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 "</imagetag>".
  2. 我无法找出(Javascript)正则表达式来提取网址。我最接近的是:([\s\S]*)<imagetag><!\[CDATA\[([\s\S]*)\]\]><\/imagetag>([\s\S]*)。如果在.jpg]之后没有换行符,那么这种方法很有效,但是有!
  3. 我猜这两个问题是相关的,但我不确定原因。任何帮助表示赞赏!

1 个答案:

答案 0 :(得分: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(尽管可以对特定问题应用现场检查/修复,例如查找和修复嵌入空格的]]>)。前进的方向是修复数据。以下是您修复的数据,以便正确使用CDATA:

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

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

重要提示: CDStart必须为<![CDATA[CDEnd必须为]]> 完全没有换行符< / EM> 即可。另请注意,]]>不能出现在CDATA部分中; CDATA部分无法嵌套。

如果无法修复数据,请拒绝数据。处理文本数据不是很合适,就好像它是XML一样;它只会使问题长期存在。