在使用Python的ElementTree处理它时,哪种XML样式更好?

2024-04-27 03:20:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我想以级联的方式在XML中存储一些相对简单的内容。其思想是一个构建可以有许多参数集,Python脚本通过读取这些参数集来创建必要的构建构件(*.h等),如果两个集具有相同的参数,则后者将替换前者。在

有(至少)两种不同的XML处理方法:

第一种方法:

<Variants>
<Variant name="foo" Info="foobar">1</Variant
</Variants>

第二种方法:

^{2}$

在ElementTree中哪个更容易处理。我有限的理解声称它将是第一个,因为我可以用find()轻松搜索变量并接收整个子树,但是使用第二个样式是否同样容易?我的同事说后一种XML更好,因为它可以更容易地扩展XML(他显然是对的),但我认为扩展性目前不是一个主要因素(很可能我们永远都不需要它)。在

编辑:我当然也可以使用lxml,在这种情况下有关系吗?速度真的不是问题,文件相对较小。在


Tags: 方法nameinfo脚本内容参数foo方式
2条回答

请记住XML属性的关键限制:

  • 属性名必须是XML名称。在
  • 一个元素只能有一个具有给定名称的属性。在
  • 属性的排序并不重要。在

关键字/其他属性表示关键字/值对。如果您可以在Python中将它表示为一个字典,字典的键是XML名称,其值是字符串,那么就可以在XML中将它表示为一组属性,而不管“it”是什么。在

如果不能-例如,如果排序很重要,或者需要一个值来包含子元素-那么就不应该使用属性。在

你们都是对的,但我会尽可能选择1,除了文本内容:

  • 1更简洁易懂,因此不易出错。

  • 完全可扩展性:YAGNI。YAGNI并不总是正确的,但是如果您确信自己不需要扩展性,就不要为了扩展性而牺牲其他好处。在
  • 1仍然具有很强的可扩展性。您总是可以添加更多的属性或子元素。唯一不可扩展的方法是,如果以后发现您需要name,或info(或文本内容值)的多个值。。。因为在一个元素上不能有多个同名的属性(也不能在多个文本内容节点之间没有任何东西)。但是,您仍然可以通过各种技术来扩展它们,例如在属性中使用空格分隔的值,或者添加子元素作为属性的替代。

  • 我会将“值”变成属性或子元素,而不是使用文本内容。如果您必须添加一个子元素,并且在那里有文本内容,那么最终将得到混合的内容(文本作为元素的兄弟元素),这会使处理变得混乱。在

更新:进一步阅读

一些关于XML元素与属性的辩论的好文章,包括何时使用它们:

另请参阅this SO question(但我认为以上内容提供了更有益的阅读)。在

相关问题 更多 >