【问题标题】:Repairing XML documents - Python 3修复 XML 文档 - Python 3
【发布时间】:2018-12-05 07:51:01
【问题描述】:

我有大约 600 个 XML 文档,必须对其进行解析以进行某些处理。但由于缺少标签,它们不是有效的 XML 文档。 他们应该具有的正确有效结构是-

<article xmlns:xlink="http://www.w3.org/1999/xlink">
  <bdy>
   .....
   .....
   .....
  </bdy>
</article>

一个 XML 文档包含数百个这样的 &lt;article&gt;...&lt;/article&gt; 块。但问题是某些此类块缺少关闭 &lt;/bdy&gt;&lt;/article&gt; 标记,从而使它们可以使用 Python 模块解析,例如 - 'lxml'、'xml.dom'、'xml.etree.ElementTree '等。

此外,由于大约有 600 个此类文件,因此手动尝试修复它们似乎是不可行的。

关于如何正确处理它们的任何建议?

谢谢

“article.dtd”文件可以下载如下-

article.dtd

【问题讨论】:

    标签: xml python-3.x xml-parsing


    【解决方案1】:

    您可以利用 SGML 标签推断来生成缺少的结束元素标签。编写一个DTD文件doc.dtd,内容如下:

    <!ELEMENT doc O O (article+)>
    <!ELEMENT article - O (bdy)>
    <!ELEMENT bdy - O (#PCDATA)>
    

    告诉 SGML articlebdy 的结束元素标签,以及 doc(用作文档元素的人造容器元素)的开始和结束元素标签都可以按照相应元素/标签的O 标签省略指示符。

    然后插入一行

    <!DOCTYPE doc SYSTEM "doc.dtd">
    

    在要解析的文件的开头。

    然后安装例如。 OpenSP 并在文件上调用 osx 程序以生成格式良好的 XML。

    更多详情请参见Querying Non-XML compliant structured data

    【讨论】:

    • 有一个文件“article.dtd”包含字符编码集的代码。对于 ex- 、 等。我是否应该将 3 行的 "doc.dtd" 和 "article.dtd" 文件添加到然后在这个 XML 文件上调用 osx 程序?
    • @Arun 是的,如果article.dtd 中有其他元素和属性声明,您也应该添加它们或相应地调整它们,尽管如果没有更多信息很难判断
    • 我在问题中添加了“article.dtd”文件。当我运行命令'osx file334.xml > repaired_file334.xml'时,它给了我很多错误-“osx:doc533.xml:362:184: entity is defined here osx:doc533.xml:644:18:E: reference to无法为其生成系统标识符的实体“nbsp”和许多其他错误
    • @Arun 你得到的错误是因为 .dtd 文件没有被使用所以检查你在第 1 行的 DOCTYPE 声明。我刚刚制作了一个最小的测试文件,其中包含一篇省略的文章article 和 bdy 结束元素,按照我链接的 SO 答案中概述的说明,它工作正常。但是您应该使用osgmlnorm 而不是osx,并且您必须在SGML 声明中将OMITTAG NO 行更改为OMITTAG YES,以使SGML 不会抱怨缺少结束元素标签。
    猜你喜欢
    • 1970-01-01
    • 2017-03-21
    • 1970-01-01
    • 2012-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-31
    相关资源
    最近更新 更多