使用 xmlstarlet 非 XML 兼容文档 (XHTML)
Using xmlstarlet non XML compliant documents (XHTML)
我有不 XML 合规的文档(XHTML 页面),其中包含未正确关闭的标签、img、br、hr。
我需要正确关闭图像、hr 和 br 标签,'/>'
我尝试了 xmlstarlet,它完成了工作,但改变了 XML 声明 header。
所以我的原代码如下:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:epub="http://www.idpf.org/2007/ops" xml:lang="en" lang="en">
<head>
<title> </title>
<link rel="stylesheet" type="text/css" href="style.css" />
</head>
<body>
如果我运行命令xmlstarlet fo --recover --html file.xhtml
,
输出不正确,有 2 行声明:
<?xml version="1.0" standalone="yes"?>
<!DOCTYPE html>
<?xml version="1.0" encoding="UTF-8" standalone="no"??>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:epub="http://www.idpf.org/2007/ops" xml:lang="en" lang="en">
<head>
<title> </title>
<link rel="stylesheet" type="text/css" href="style.css"/>
</head>
<body>
如果我运行xmlstarlet fo --omit-decl --recover --html file.xhtml
,
输出也不正确,因为声明需要在第一行:
<!DOCTYPE html>
<?xml version="1.0" encoding="UTF-8" standalone="no"??>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:epub="http://www.idpf.org/2007/ops" xml:lang="en" lang="en">
<head>
<title> </title>
<link rel="stylesheet" type="text/css" href="style.css"/>
</head>
<body>
所以我需要post-processing,交换第一行和第二行。什么 bash 命令可以帮助解决这个问题?请指定 bath 处理文件和就地编辑的命令语法。
P.S。为什么 xmlstarlet 在声明末尾放置 2 个问号字符? (“不”??>)
我建议附加 | sed -n '1{h;d};2{p;g};p'
.
这可能适合您 (GNU sed):
sed -zE 's/(.*)\n(.*)/\n/m' file
将文件 Slurp 到内存中并交换第 1 行和第 2 行的内容。
N.B。 m
标志允许 .*
引用行内容。
我有不 XML 合规的文档(XHTML 页面),其中包含未正确关闭的标签、img、br、hr。
我需要正确关闭图像、hr 和 br 标签,'/>'
我尝试了 xmlstarlet,它完成了工作,但改变了 XML 声明 header。
所以我的原代码如下:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:epub="http://www.idpf.org/2007/ops" xml:lang="en" lang="en">
<head>
<title> </title>
<link rel="stylesheet" type="text/css" href="style.css" />
</head>
<body>
如果我运行命令xmlstarlet fo --recover --html file.xhtml
,
输出不正确,有 2 行声明:
<?xml version="1.0" standalone="yes"?>
<!DOCTYPE html>
<?xml version="1.0" encoding="UTF-8" standalone="no"??>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:epub="http://www.idpf.org/2007/ops" xml:lang="en" lang="en">
<head>
<title> </title>
<link rel="stylesheet" type="text/css" href="style.css"/>
</head>
<body>
如果我运行xmlstarlet fo --omit-decl --recover --html file.xhtml
,
输出也不正确,因为声明需要在第一行:
<!DOCTYPE html>
<?xml version="1.0" encoding="UTF-8" standalone="no"??>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:epub="http://www.idpf.org/2007/ops" xml:lang="en" lang="en">
<head>
<title> </title>
<link rel="stylesheet" type="text/css" href="style.css"/>
</head>
<body>
所以我需要post-processing,交换第一行和第二行。什么 bash 命令可以帮助解决这个问题?请指定 bath 处理文件和就地编辑的命令语法。 P.S。为什么 xmlstarlet 在声明末尾放置 2 个问号字符? (“不”??>)
我建议附加 | sed -n '1{h;d};2{p;g};p'
.
这可能适合您 (GNU sed):
sed -zE 's/(.*)\n(.*)/\n/m' file
将文件 Slurp 到内存中并交换第 1 行和第 2 行的内容。
N.B。 m
标志允许 .*
引用行内容。