漂亮的打印格式错误的xml

时间:2013-02-25 19:08:44

标签: xml pretty-print

我正在进行数据迁移,我正在解析并将html导出到xml中。当然,当html进入xml时,html会被转义,但为了验证解析是否正确发生,我正在解码括号以获取xml中可读的html标记。但是,这些标签都是一起运行的,而且它仍然不是很易读。

有什么东西可以简单地缩进我的标签结构吗?它既不是有效的xml也不是html。我已经尝试了xmllint --formatxmllint --htmlout,但这两个人都在不同的地方窒息。

我可以手动避免这样做吗?

这是一个小例子:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<result><node><title>This would be the title</title><uri>/path/filename.jpg</uri><alt>Alt tag data</alt><body><p>Some text goes here.</body></node></result>

在实际数据中,<body>中的html标记都转义为&lt;&gt;,但要查看解析是否正常工作太难以观察。所以我通过查找和替换将它们更改为等效的括号。但它们仍然没有缩进,所以很难阅读。

tidyxmllint都抱怨缺少结束<p>标记。在此数据中,存在许多丢失或不匹配的标记。我明白这不是有效的html或xml,但是我们稍后会对html进行清理,此时我只需要确保html在正确的地方被解析,这在那里很难看到没有换行符或缩进。

要修复上面的示例,我可以手动删除或关闭<p>标记,但在实际数据中,存在很多破坏,将标记修复为仅仅是一项非常重要的任务让它解析格式化。在这个阶段,我试图避免手动按摩并以自动方式做事。

例如,对于这个文件,整理报告65个警告和778个错误。手动修复它们将浪费时间 - 我不妨开始缩进自己。我需要能够以非严格方式缩进的东西,并且不会关心无法匹配的标签。

3 个答案:

答案 0 :(得分:1)

您应该尝试

$ tidy -h
tidy [option...] [file...] [option...] [file...]
Utility to clean up and pretty print HTML/XHTML/XML

请参阅http://tidy.sourceforge.net/

修改

您的问题只是<p>标记,您应将其删除:

$ xmllint --format file.xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<result>
  <node>
    <title>This would be the title</title>
    <uri>/path/filename.jpg</uri>
    <alt>Alt tag data</alt>
    <body>Some text goes here.</body>
  </node>
</result>

没有错误。

编辑2

我的想法是使用像html2text这样的工具来提供没有html标签的xml,也许你可以在HTML CTAGS中存储HTML文件的缩进

答案 1 :(得分:1)

我使用了Josh Leitzel用户here发布的格式化功能。不完美,但足够好。

答案 2 :(得分:1)

我最近遇到了这个问题,并使用BeautifulSoup(v4 +)在Python(3)中编写了我自己的问题,并在textwrap.wrap()提供了一些额外的长行包装:

   import sys
   from bs4 import BeautifulSoup
   from textwrap import wrap

   path = f'{sys.argv[1]}'

   with open(path) as fp:
       for line in wrap(BeautifulSoup(fp).prettify(), replace_whitespace=False):
           print(line)

BeutifySoup在杂乱地解释大多数基于标签的垃圾方面做得很好。但是,没有使用此解决方案缩进标签。