- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
Python 的 lxml.etree.tostring() 在 Mac 和 Linux 上的缩进不同——缩进似乎是 Linux 上的两倍。它炸毁了我的单元测试。
显然 lxml.etree 没有公开任何设置默认缩进值的路径。
有人知道这里会发生什么吗?
编辑添加代码:
我确定代码是相同的,计算机通过 github 共享它。
测试代码如下:
chk = """\
<field>
<id>7135260</id>
<name>lastname</name>
<label>Last Name</label>
<type/>
</field>"""
res = etree.tostring((xml_obj.xpath(xp_str))[0], pretty_print=True)
self.assertMultiLineEqual(
chk,
res.rstrip()
)
这在 Linux 上通过了,但在 Mac 上失败了,错误报告如下:
- <id>7135260</id>
+ <id>7135260</id>
? ++++++
- <name>lastname</name>
+ <name>lastname</name>
? ++++++
- <label>Last Name</label>
+ <label>Last Name</label>
? ++++++
- <type/>
+ <type/>
? ++++++
- </field>
+ </field>
? ++++
但是当我隔离有问题的代码时,它在两者上输出相同的内容:
data_str = """\
<response>
<fields>
<field>
<id>7135259</id>
<name>firstname</name>
<label>First Name</label>
<type/>
</field>
<field>
<id>7135260</id>
<name>lastname</name>
<label>Last Name</label>
<type/>
</field>
</fields>
<status>success</status>
</response>
"""
data_xml = etree.fromstring(data_str)
res = etree.tostring(
(data_xml.xpath('//*[name="lastname"]/name/..'))[0],
pretty_print=True)
print res
这在两个平台上提供了相同的缩进。
所以无论奇怪的是什么,它都位于/由 unittest2 引起。在这一点上,这可能不是一个很好的问题。
进一步编辑:
当我将比较项包装在 repr() 中时,我得到:
- '<field>\n <id>7135260</id>\n <name>lastname</name>\n <label>Last Name</label>\n <type/>\n </field>'
+ '<field>\n <id>7135260</id>\n <name>lastname</name>\n <label>Last Name</label>\n <type/>\n </field>\n \n'
? ++++++ ++++++ ++++++ ++++++ ++++ ++++++++++++
该输出实际上在一行中。我先插入了换行符 + 符号和 ?性格。
我已经在测试输出中搜索了制表符 ('\t')。我确定我没有插入制表符,我正在使用带有“set expandtab”的 vi。
最佳答案
在每种情况下,您是否对 tostring()
使用了完全相同的参数?您是否尝试过关闭缩进以检查这是否真的是问题所在?
向我们展示您调用 tostring() 的代码。创建一个小示例树并向我们展示每个操作系统上 print len(result_of_tostring), repr(result_of_tostring) 的结果。还要告诉我们您如何将结果传输到其他系统进行比较,并向我们展示该比较的代码。
更新:您的“chk”字符串的缩进看起来很可疑。我建议 lxml 没有错,你有一个实验错误,有空格差异。您是否从代码中删除了所有 TAB?您确定您没有使用将制表符替换为空格或反之亦然的编辑器打开/保存代码吗? 为什么不按照建议使用 repr() 来准确/明确地显示不相等的字符串是什么?
更新 2:在您的源代码中搜索选项卡。大多数行的“chk”显示源缩进为 6。
关于python - lxml.etree.tostring() 中的缩进因 Mac 和 Linux 而异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8718072/
lxml提供了一些不同的函数来解析字符串。其中两个,etree.fromstring()和 etree.XML() ,看起来很像。前者的文档字符串说它用于解析“字符串”,而后者是“字符串常量”。此外,
我有一个使用 lxml.etree 解析 XML 的脚本: from lxml import etree parser = etree.XMLParser(load_dtd=True, resolve
我一直在将我的一些原始 xml.etree.ElementTree (ET) 代码转换为 lxml.etree (lxmlET )。幸运的是,两者之间有很多相似之处。 但是,我确实偶然发现了一些我在任
是否有任何解决方案可以添加不带前缀的命名空间(我的意思是这些 ns0、ns1),它们适用于所有 etree 实现,或者每个实现都有可行的解决方案? 目前我有以下解决方案: lxml - 元素的 nsm
我正在使用 aws 的 Alexa api,但我发现很难解析结果以获得我想要的内容 alexa api 返回一个对象树 我使用此代码来打印树 from lxml import etree root
当涉及到模块/库时,为了可读性,我喜欢在 python 中使用完整的命名空间。我想知道为什么这对 xml 库不起作用。我认为 import xml 还将导入 etree 和命名空间中的所有其他内容。至
我有一个从 etree 元素返回列表的函数,但它不会查看嵌套元素。 (我正在
尝试从 serpscrap 包运行示例 .py 时出现错误。 我在 Pythonista 中使用 iPhoneX。 如有任何帮助,我们将不胜感激。 这是回溯 Traceback (most recen
如何删除或移除 server1 的所有条目,包括标签?我尝试使用 etree 删除功能,但它没有帮助
我试图将多个文件写入一个目录,每个文件之间几乎没有变化(例如增量ID号)当我尝试运行我的程序时,它在写入大约5个文件后失败。但是当我再次尝试并重新选择源文件时,它就有效了。这是我的代码: if not
如何在 Python xml.etree 中克隆 Element 对象?我正在尝试按程序移动和复制(然后修改它们的属性)节点。 最佳答案 您可以使用 copy.deepcopy()制作元素的副本。 (
我正在创建一个简单的脚本来使用特定模式解析、验证、修复和重新打印 XML 文件。整个过程运行良好,但问题是当我打印修改后的 ElementTree 时,它会删除我所有的实体引用。 这是简化的 py
xml文件结构如下 我的解析器首先获取所有 元素 from lxml import etr
在Relationship下,我只想保留具有TO_FDN="FtpServer=,并删除所有其他内容。如何在 python 2.6 中使用 etree 来做到这一点?
尝试使用 lxml 生成 xml 文件。 在 API 文档中指出 xmlfile 类存在: http://lxml.de/api/lxml.etree.xmlfile-class.html 我使用导入
我想在 Python 中创建一个像这样的元素树: 我想将其用作一个空模板,以便稍后使用。但是,我无法插入或附加多个 元素到元素,不过 etree.SubElement作品。更具体
我有一个脚本,它使用 xml.etree.ElementTree 来解析 XML 文件,并且应该向元素添加一个子元素。我有两种方法,这两种方法在技术上都有效,但当我使用 ET.dump(root) 转
我有一个 XML 格式的 ISM 文件(InstallShield 项目)。 我需要更改文件中的一些属性,因此我使用了 xml.etree.ElementTree(Python 库)。 我可以找到这些
我正在遍历 XML 树,但从树中提取节点而留下其内部节点时遇到了一些麻烦。 例如:
为了向现有元素添加新的子元素,我必须调用类方法,并将父元素作为参数。我希望子元素的创建是即将成为父元素的实例方法,并将子元素(来自 Element 构造函数)作为唯一的形式参数。 实际: #!/usr
我是一名优秀的程序员,十分优秀!