我有一个简单的任务让我把头发拉出来,我确定我非常接近。
这是我的xhtml文件:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Test Page</title>
</head>
<body>
<p>
test
</p>
<table id="test_table">
<tr><td>test</td><td>test</td></tr>
<tr><th>mo test</th></tr>
</table>
</body>
</html>
...而xmlstarlet喜欢它:
$ xmlstarlet.exe el -v test.xhtml
html[@xmlns='http://www.w3.org/1999/xhtml']
html/head
html/head/title
html/body
html/body/p
html/body/table[@id='test_table']
html/body/table/tr
html/body/table/tr/td
html/body/table/tr/td
html/body/table/tr
html/body/table/tr/th
我需要做的是提取表标签中的数据,最好不要使用HTML。对此的上下文是我正在编写一个测试集,其中一个网页被调用然后写入文件。测试要求我验证表数据,但如果页面上的其他内容发生变化,则允许测试成功。此外,我不会事先知道该表将包含多少列或行,它可能会因数据而异。
但是当我尝试时:
$ xmlstarlet.exe sel -t -c "/html/body/table[@id='test_table']" test.xhtml
Attempt to load network entity http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd
None of the XPaths matched; to match a node in the default namespace
use '_' as the prefix (see section 5.1 in the manual).
For instance, use /_:node instead of /node
我需要不同的id来进行不同的测试,但它们都有唯一的id值。所以,给定xhthml中的任何'id',我需要它的数据。
提前感谢。
答案 0 :(得分:8)
html
数据有一个默认命名空间,您必须在xmlstarlet
命令中声明:
xmlstarlet sel \
-N n="http://www.w3.org/1999/xhtml" \
-t \
-c "/n:html/n:body/n:table[@id='test_table']/descendant::*/text()" \
htmlfile 2>/dev/null
找到<table>
元素后,我使用descendant::*/text()
提取其中的所有文本元素,并使用2>/dev/null
跳过警告:
Attempt to load network entity http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd
它产生:
testtestmo test
UPDATE :我不知道,但正如错误消息所示,没有必要在默认名称空间声明名称空间,所以这也有效:
xmlstarlet sel \
-t \
-c "/_:html/_:body/_:table[@id='test_table']/descendant::*/text()" \
htmlfile 2>/dev/null
答案 1 :(得分:0)
如
中所述http://xmlstar.sourceforge.net/doc/UG/ch05.html
使用
时的常见问题-N x="http://www.w3.org/1999/xhtml" \
选项您还必须使用
为节点选择添加前缀x:
e.g。
xmlstarlet sel \
-N x="http://www.w3.org/1999/xhtml" \
-t \
-m "//x:pre" \
-v . somehtml.html
将选择所有预先节点
答案 2 :(得分:-1)
你可以尝试
xmlstarlet ed --inplace -u "html/body/table[@id='your_tabl e_id']/tr[@id='row_id']/td[@id='data_id']" -v NEW_VALUE_TO_BE_CHANGED HTMLFILE_NAME 2>/dev/null