使用 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 标志允许 .* 引用行内容。