【发布时间】:2016-12-21 16:42:44
【问题描述】:
可以使用lxml 根据给定的 XSD 架构验证 XML 文件。
有没有办法在不那么严格的意义上应用这种验证,忽略所有包含特殊表达式的元素?
考虑以下示例:假设我有一个 xml_file:
<foo>99</foo>
<foo>{{var1}}</foo>
<foo>{{var2}}</foo>
<foo>999</foo>
现在,我在这个文件上运行一个程序,替换{{...}}-表达式并生成一个新文件:
xml_file_new:
<foo>99</foo>
<foo>23</foo>
<foo>42</foo>
<foo>999</foo>
到目前为止,我可以使用lxml 来验证新的 XML 文件,如下所示:
from lxml import etree
xml_root = etree.parse(xml_file_new)
xsd_root = etree.parse(xsd_file)
schema = etree.XMLSchema(xsd_root)
schema.validate(xml_root)
我的示例中的相关点是架构将 <foo> 内容限制为整数。
不可能提前在旧的xml_file 上应用架构,但是,由于我的程序执行了一些其他昂贵的任务,我想这样做,同时忽略所有包含任何{{...}}-表达式的行:
<foo>99</foo> <!-- should be checked-->
<foo>{{var1}}</foo> <!-- should be ignored -->
<foo>{{var2}}</foo> <!-- should be ignored -->
<foo>999</foo> <!-- should be checked-->
编辑:可能的解决方案:一种想法是定义两个模式
- 新文件的第二个严格模式,只允许整数
- 旧文件的宽松模式,允许使用
{{..}}-expressions 的整数和任意字符串
但是,为了避免保持两个模式同步的冗余任务,需要一种方法来自动从严格模式生成宽松模式。这听起来很有希望,因为两种模式具有相同的结构,只是某些元素内容的限制不同。 XSD 是否提供了一个简单的概念,它只允许从一个模式“继承”,然后将额外的放松“附加”到各个元素?
【问题讨论】:
-
如果不更改 XML 或架构,我认为这是不可能的。由于您无法更改 XML,您是否愿意更改架构?因为你可以为
<foo>定义一个联合类型,它允许either 整数或{{var...}}。 -
谢谢,我已经这样做了。但是,我仍然想在替换后 使用严格的整数检查并禁止
{{...}}-表达式。第一次检查只是为了节省时间而预先检测问题,第二次检查很重要。为了确保{{var1}}在新文件中被一个整数替换,还需要排除{{var1}}在new 文件中被{{var3}}替换的情况。在这里对两个检查使用相同的架构会产生误报。 -
另一方面,我担心使用两个模式(第一个宽松,第二个更严格)会导致很多冗余,尤其是当我需要非常频繁地更改和更新模式时。跨度>
-
@Meyer 请看我的编辑。
标签: python xml xsd lxml xsd-validation