【问题标题】:Validating psuedo xml file using Perl使用 Perl 验证伪 xml 文件
【发布时间】:2012-08-24 12:40:29
【问题描述】:

我有一个文件,其中包含类似 xml 的标签和一堆无效的 xml 数据,因此我无法在文件上使用像 xmllint 这样的普通 xml 验证器。我想忽略无效的 xml 数据,只检查文件的格式是否正确。

<?xml version="1.0" encoding="utf-8"?>
<HOST>
<VERSION>5</VERSION> 
<OUTPUT>
   bunch of text which also contains tags like  <SYSTEM> 
   more tags like <->   <temp>  & ; 
   some more text and numbers
 </OUTPUT>
</HOST>

在上面的示例中,我可以忽略 、、&、; 等标签吗?等,只需检查有效的开始和结束标签,如 输出>。上面的文件应该返回说它的格式正确,因为所有有效的标签都有正确的开始和结束括号。

我可以创建自己的 dtd/xsd 吗?使用 Perl 查找我想要的标签并忽略其余标签。

我的主要问题是我不知道正确的关键字来描述我的问题,这就是为什么谷歌没有给我正确的结果。有人可以将我推向正确的方向。谢谢

【问题讨论】:

  • 无效部分总是在OUTPUT标签内吗?
  • 是的。我只想补充一点,这些文件很大,有些包含 10k 行。
  • 您可以通过某种方式在所有&lt;OUTPUT&gt; 标签中添加&lt;![CDATA[]]&gt;。这将使您能够使用任何适当的解析器解析/验证文件。问题是你必须以一种相当丑陋的方式这样做。
  • 我真的不想在文件中写入/修改任何内容,除非它是最坏的解决方案。所以我在想我可以创建自己的 xml 来检查开始和结束标签,而不关心 部分中的内容。

标签: xml perl validation


【解决方案1】:

请问有什么意义吗?您的输入文件不是 XML,并且您不想通过添加 CDATA 部分使其成为 XML。通过了解“某些”数据是否是 XML,您可以获得什么?这不像您将能够在其上使用 XML 工具,或者 ypo 将能够将其作为 XML 交付。

所以实际上这种非验证并没有为您带来任何好处。那岂不是有点浪费时间?

【讨论】:

  • 该文件稍后用于解析,当解析器发现标签 未正确关闭时,它会出错。解析器能够读取 中的内容,即使它不是有效的 XML。
  • 那么,使用(非 XML)解析器来验证格式。为什么要假装它不是 XML?
  • 如果它真的那么令人反感,您可以构建一个自定义解析器来构建一个 DOM 树或生成 SAX 事件以向 XML 工具收费,但这不是可以在这里简短回答的东西.
  • 我将研究构建自己的自定义解析器。我在这里发布问题的原因是因为我不知道描述我的问题的正确关键字。感谢您的评论,至少我知道要寻找什么样的关键字。
【解决方案2】:

您必须先清理输入。一旦你这样做了,你就可以做 DTD、模式、正确的解析等等。

如果只是OUTPUT标签,你可以试试这个:

s/(<OUTPUT>)/$1<![CDATA[/;
s/(</OUTPUT>)/]]>$1/;

完成后,您的输入应该可以用于 XML 解析、验证等。如果您的输入可能包含 CDATA 部分,您将需要做更多工作,但这应该足以开始。

【讨论】:

  • 您不必对文件本身执行此操作。您可以在读取它们时将其应用于行并将它们写入第二个文件,或者将重写的版本保存在字符串中。
  • 我尝试了您的代码,方法是制作一个临时文件,然后对传递给 xmllint 的临时文件进行修改,但它没有抱怨。我仍然有点犹豫是否使用这种方法。我假设通过使用我想要的标签创建我自己的 XML 模式,我可以轻松地验证文件而无需进行任何修改。我认为这就是 XML 的全部意义所在,您可以在其中创建自己的模式。我错了吗?
  • @sumedh 数据需要格式正确,任何 XML 工具才能处理它。你逃不掉的。
  • @sumedh,但 XML 是一种非常非常特殊的格式。它要求所有内容都正确格式化。如果甚至有一个解析错误,那么现有的 XML 工具就会死掉。有一些工具允许有点模糊,但我不知道有任何 DTD 或模式工具会那么模糊。
  • 您可以尝试另一种选择,即编写您自己的解析器来生成您需要的 SAX 事件或 DTD 或 Schema 可以操作的 DOM 树。但是,为自定义格式编写完整的解析器可能远远超出 StackOverflow 的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-10
  • 2012-06-04
相关资源
最近更新 更多