xmlstarlet解析器错误:未定义实体'*'

时间:2011-03-11 12:21:54

标签: xml entity dtd xmlstarlet

在网页上使用xmlstarlet时,我大部分时间都面临实体引用错误。 这使得它无法从网页中提取。

由于html页面格式不正确XML(还有一些处理html的选项吗?) 我用

转换它们
tidy -asxhtml 

到XHTML,其中整理了声明

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

然后用xmlstarlet处理它

curl http://www.xfree86.org/current/index.html |  tidy -asxhtml | \
  xmlstarlet sel --net -T   -t -m hr -v . -

它总是抛出相同的错误

-:13: parser error : Entity 'reg' not defined
<h1>Documentation for XFree86&reg; version 4.8.0</h1>

有人知道如何让xmlsttarlet知道实体引用文件。

1 个答案:

答案 0 :(得分:6)

尝试告诉整洁将字符实体转换为数字实体,如下所示:

curl --silent -q http://www.xfree86.org/current/index.html | \
tidy -q -numeric -asxhtml --show-warnings no  | \
xmlstarlet sel -N xhtml="http://www.w3.org/1999/xhtml" -t -m "//xhtml:hr" -c . -n 2>/dev/null

在这里,我添加了以下选项:

  • 通过--silent-q
  • 告诉卷曲保持沉默
  • 通过-q--show-warnings no
  • 告诉他们保持安静
  • 通过-numeric
  • 将实体转换为数字实体
  • 给xmlstarlet xhtml命名空间用于带-N的XPath,并将其命名为xhtml
  • 更改XPath以匹配命名空间hr
  • 中的xhtml

这可以解除实体未定义的错误,使之前的命令全部无声,并选择所需的元素。

然而,当我尝试使用xmlstarlet v1.0.6时,我仍然得到这个:

Entity: line 1: parser warning : xmlParsePITarget: invalid name prefix 'xml'
<?xmlstarlet version="1.0"?>

不确定这是否真的重要,但它似乎是一个可以安全忽略的警告......所以我只需用2>/dev/null

将stderr输出到/ dev / null