我需要对可能是HTML 5的XML进行验证。HTML 4和XHTML只有大约250个实体,而当前的草案(2012年1月)有2000多个。
GET 'http://www.w3.org/TR/html5-author/named-character-references.html' |
xmllint --html --xmlout --format --noent - |
egrep '<code|<span.*glyph' |
sed -e 's/.*">/__/' |
sed -e 's/<.*/__/' |
sed 's/"/\"/' |
sed "s/'/\'/" |
xargs -n 2 echo |
sed 's/__/<!ENTITY /' |
sed 's/;__/ /' |
sed 's/ __/"/' |
sed 's/__$/">/' |
egrep -v '\bapos\b|\bquot\b|\blt\b|\bgt\b|\bamp\b'
您最终得到的是一个包含2114个实体的文件。
<!ENTITY AElig "Æ">
<!ENTITY Aacute "Á">
<!ENTITY Abreve "Ă">
<!ENTITY Acirc "Â">
<!ENTITY Acy "А">
<!ENTITY Afr "𝔄">
将此内容插入XML解析器中,应该允许XML解析器解析这些字符实体。
更新于2012年10月:由于工作草案现在有一个JSON文件(是的,我仍然在使用正则表达式),我将其简化为一个单独的sed命令。
curl -s 'http://www.w3.org/TR/html5-author/entities.json' |
sed -n '/^ "&/s/"&\([^;"]*\)[^0-9]*\[\([0-9]*\)\].*/<!ENTITY \1 "\&#\2;">/p' |
uniq
当然,使用JavaScript编写等价代码会更加强大,但并非每个人都安装了node。而sed是几乎所有人都有的工具,对吧?随机样本输出:
<!ENTITY subsetneqq "⫋">
<!ENTITY subsim "⫇">
<!ENTITY subsub "⫕">
<!ENTITY subsup "⫓">
<!ENTITY succapprox "⪸">
<!ENTITY succ "≻">
 
更不可读呢? - Evan Carroll