XML验证错误:EntityRef:期望';'。

54
<url>
  <loc>http://www.ezed.in/ezed/courseDemoIntroPage.do?courseId=COU10000000138003530&checkingCourseFrom=preLogin#.U2DcKvmSySo</loc>
</url>

在第102行第103列出现错误:EntityRef: 预期';'。

无法确定问题所在。

3个回答

127

您的 URL 必须进行转义。

& 字符在 XML 中用于插入一个带有语法 &name; 的字符引用(注意名称后面有 ;)。解析器期望一个 ;,但找不到它(存在更多可用的分隔符,这只是最常见的情况)。

解决方法是进行转义(如何进行取决于您用于生成该 XML 文件的语言),但最终结果必须类似于这样:

<url>
  <loc>http://www.ezed.in/ezed/courseDemoIntroPage.do?courseId=COU10000000138003530&amp;checkingCourseFrom=preLogin#.U2DcKvmSySo</loc>
</url>

请注意,普通的&已被替换为其转义版本&amp;。更多详细信息请参见这篇简单文章

另一个可能的解决方案(如果您不想/不能转义)是将URL放在一个CDATA节中,像这样:

<url>
  <loc><![CDATA[http://www.ezed.in/ezed/courseDemoIntroPage.do?courseId=COU10000000138003530&checkingCourseFrom=preLogin#.U2DcKvmSySo]]></loc>
</url>

对我来说,CDATA并没有起作用。但是将&替换为超长的URL非常有效。 - Lambert
它运行了,非常感谢!只有一个问题:为什么在本地主机上不需要转义就能运行,但在生产环境中却不能? - titoih
除非URL或错误处理不同,否则不应该有任何区别。 - Adriano Repetti

4
以下是另一种方法:
我们可以使用PHP的原生函数htmlspecialchars来替代"CDATA",用于url节点。对于一些不希望在xml输出中使用CDATA的xml源,这将非常有帮助。
谢谢。

2
如果解析器无法解析,你该如何在节点上运行任何函数?当出现解析器错误时,您根本无法迭代XML对象。 - stamster

3

今天我遇到了同样的问题,如果你正在使用PHP构建链接,你可以使用这个函数:

htmlspecialchars();

该功能将为您格式化所需字符串,以便您可以将其作为 <loc> 插入HTML字符。


2
这不是与此答案中的建议相同吗? - barbsan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接