我的Perl程序正在处理XML文件。有些条目可能包含&符号。解析器中断,并说:“实体中的名称无效”。XML中的编码和符号
如何处理文件并在所有不正确的实体中编码& -s?
所以,这将是这样的:
<words>text1 & text2</words> --> <words>text1 & text2</words>
我的Perl程序正在处理XML文件。有些条目可能包含&符号。解析器中断,并说:“实体中的名称无效”。XML中的编码和符号
如何处理文件并在所有不正确的实体中编码& -s?
所以,这将是这样的:
<words>text1 & text2</words> --> <words>text1 & text2</words>
这是棘手,不平凡的,并且通常涉及权衡。当我遇到了类似的问题,更换&
字符,随后要么&
大写字符或(在正则表达式/\&[A-Z ]/
)空格(和“尾随字符”)解决了大多数情况下 - 这是通常不够好,因为你已经去了通过接受格式不正确的XML输入来增加额外的英里数。
在XML中,声明具有像'&A;'这样的大写字母的实体是合法的,将文档转换为XML的更好方法是使用否定断言,即&后面没有可能是有效的实体名称。 '/ /(?![[:alpha:] _:] [\ w.:-]*;)/ & /'这并不完全符合XML标准中的所有Unicode情况,但它基本上足够接近。 – 2012-07-16 17:51:37
这不是一个XML文件。如果它是XML,则&
将被编写为&
。处理非XML文件很困难,因为您无法使用XML解析器。最好修复创建该文件的程序,将其更改为生成适当的格式良好的XML。
您想要手动修复文件还是在程序中支持格式不正确的XML? – 2012-07-15 19:57:22
我想支持手工创建的格式不正确的XML。使其成为有效的XML。 – user4035 2012-07-15 23:56:29
如果您使用XML :: LibXML,我认为这是'recover'解析器选项将允许您忽略这些错误。 – ikegami 2012-07-16 03:04:41