当前位置: 首页 > 面试题库 >

python-lxml:强制执行属性的特定顺序

邓深
2023-03-14
问题内容

我有一个XML编写脚本,可以为特定的第三方工具输出XML。

我已经使用原始XML作为模板来确保构建所有正确的元素,但是最终的XML看起来并不像原始XML。

我以相同的顺序编写属性,但是lxml以自己的顺序编写属性。

我不确定,但是我怀疑第3部分工具希望属性按特定顺序显示,并且我想解决此问题,以便查看其属性顺序是否导致失败,或其他原因。

源元素:

<FileFormat ID="1" Name="Development Signature" PUID="dev/1" Version="1.0" MIMEType="text/x-test-signature">

我的源脚本:

sig.fileformat = etree.SubElement(sig.fileformats, "FileFormat", ID = str(db.ID), Name = db.name, PUID="fileSig/{}".format(str(db.ID)), Version = "", MIMEType = "")

我生成的XML:

<FileFormat MIMEType="" PUID="fileSig/19" Version="" Name="Printer Info File" ID="19">

有没有办法限制它们的书写顺序?


问题答案:

属性顺序和可读性 正如评论者所提到的,属性顺序在XML中没有语义上的意义,也就是说,它不会改变元素的含义:

<tag attr1="val1" attr2="val2"/>

<!-- means the same thing as: -->

<tag attr2="val2" attr1="val1"/>

SQL有一个类似的特征,即列顺序不会改变表定义的含义。XML属性和SQL列是一个 集合 (不是有 序列的集合
),因此,关于这些属性之一,可以“正式”说的就是属性或列是否存在于集合中。

就是说,这肯定会影响人类的可读性,因为在这样的结构被编写并以文本形式出现(例如源代码)并且必须进行解释的情况下,这些事物的出现顺序和顺序对我来说很有意义。

典型的解析器行为

任何将属性顺序视为重要的XML解析器都将不符合XML标准。这并不意味着它不可能发生,但是根据我的经验,这当然是不寻常的。但是,根据您提到的工具的来源,这可能值得测试。

据我所知,lxml没有指定顺序属性出现在序列化XML中的机制,如果确实如此,我会感到惊讶。

为了测试行为,我强烈倾向于编写一个基于文本的模板以生成足够的XML来对其进行测试:

id = 1
name = 'Development Signature'
puid = 'dev/1'
version = '1.0'
mimetype = 'text/x-test-signature'

template = ('<FileFormat ID="%d" Name="%s" PUID="%s" Version="%s" '
            'MIMEType="%s">')

xml = template % (id, name, puid, version, mimetype)


 类似资料:
  • 问题内容: 如何修改/设置两个值? 主机IP地址 value =“ 0x00010a248921” “供应商ID” 值=“ 11” 我尝试访问失败, 目标: 我更希望看到一个lxml.objectify与一个Xpath解决方案,但我将接受其他基于lxml的解决方案。 文件小于100kB,因此速度/ RAM无关紧要。 问题答案:

  • 我想通过使用JVM属性禁用不需要的密码来实现完美的前向保密(PFS) 我可以通过'jdk.tls.disabledalgorithms'完成吗?如果没有,是否有其他JVM级别的机制?

  • 问题内容: 如何在Python中将类成员变量限制为特定类型? 较长版本: 我有一个具有多个成员变量的类,这些成员变量在该类的外部设置。由于它们的使用方式,它们必须为特定类型,即int或list。 如果这是C ++,则只需将它们设为私有,然后在“ set”函数中进行类型检查。鉴于这是不可能的,是否有任何方法可以限制变量的类型,以便在为其分配了错误类型的值时在运行时发生错误/异常?还是我需要在使用它们

  • 和标题差不多。我在请求正文中有一个可选对象。但是,如果给定了该对象,则它必须包含几个子属性。 我的OpenAPI组件配置如下所示: 我正在使用express openapi validator来验证这一点。现在,我不明白这是否是express openapi validator包的问题,但可选字段(partner)的必填字段(名称、电话)从未验证过。我可以只提供合作伙伴:{},然后直接插入,或者甚

  • 通常,您可以有多个进程,但有时在某些操作中,我们需要确保在执行前一个进程之后执行一个进程。 我们如何在卡蒙达实现它?试图找到类似进程依赖关系的东西(因此进程在上一个进程完成后才开始),但找不到任何东西:( 我考虑在process中添加一些变量(比如),并检查指定的process是否已经完成,但也许会有更好的解决方案。

  • 问题内容: 我需要为测试设置执行顺序,因为我需要先验证一些数据。可以下订单吗? 谢谢 问题答案: 最好不要这样做。 测试应该是独立的。 要做您最想做的就是将代码放入测试调用的函数中。 像那样: 甚至拆分测试类,并将断言放入setUp函数中。 当我拆分班级时,我经常编写更多更好的测试,因为测试被拆分,并且在应该测试的所有情况下我都能看到更好的结果。