2012-07-15 82 views
2

我的Perl程序正在处理XML文件。有些条目可能包含&符号。解析器中断,并说:“实体中的名称无效”。XML中的编码和符号

如何处理文件并在所有不正确的实体中编码& -s?

所以,这将是这样的:

<words>text1 & text2</words> --> <words>text1 &amp; text2</words> 
+0

您想要手动修复文件还是在程序中支持格式不正确的XML? – 2012-07-15 19:57:22

+0

我想支持手工创建的格式不正确的XML。使其成为有效的XML。 – user4035 2012-07-15 23:56:29

+0

如果您使用XML :: LibXML,我认为这是'recover'解析器选项将允许您忽略这些错误。 – ikegami 2012-07-16 03:04:41

回答

3

这是棘手,不平凡的,并且通常涉及权衡。当我遇到了类似的问题,更换&字符,随后要么&amp;大写字符或(在正则表达式/\&[A-Z ]/)空格(和“尾随字符”)解决了大多数情况下 - 这是通常不够好,因为你已经去了通过接受格式不正确的XML输入来增加额外的英里数。

+0

在XML中,声明具有像'&A;'这样的大写字母的实体是合法的,将文档转换为XML的更好方法是使用否定断言,即&后面没有可能是有效的实体名称。 '/ /(?![[:alpha:] _:] [\ w.:-]*;)/ & /'这并不完全符合XML标准中的所有Unicode情况,但它基本上足够接近。 – 2012-07-16 17:51:37

6

这不是一个XML文件。如果它是XML,则&将被编写为&amp;。处理非XML文件很困难,因为您无法使用XML解析器。最好修复创建该文件的程序,将其更改为生成适当的格式良好的XML。