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

时间:2010-10-01 05:57:22

标签: python xml lxml

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

有(至少)两种不同的XML方式:

第一种方式:

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

第二种方式:

<Variants>
<Variant>
<Name>Foo</Name>
<Value>1</Value>
<Info>foobar</Info>
</Variant>
</Variants>

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

编辑:我当然可以使用lxml,在这种情况下是否重要?速度确实不是问题,文件相对较小。

2 个答案:

答案 0 :(得分:3)

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

  • 1更简洁,更易于阅读,因此不易出错。

  • 完全可扩展性:YAGNI。 YAGNI并不总是如此,但如果你确信自己不需要可扩展性,那么为了可扩展性,不要牺牲其他好处。
  • 1仍然是可扩展的。您始终可以添加更多属性或子元素。唯一不可扩展的方法是,如果您以后发现需要nameinfo多个值(或文本内容值)......因为您可以元素上具有多个具有相同名称的属性(也没有多个文本内容节点,但两者之间没有任何内容)。但是,您仍然可以通过各种技术扩展它们,例如属性中以空格分隔的值,或添加子元素作为属性的替代值。

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

更新:进一步阅读

关于XML元素与vs属性争论的一些好文章,包括何时使用每个:

另见this SO question(但我认为上述内容可以提供更有利可图的阅读)。

答案 1 :(得分:1)

记住XML属性的关键限制:

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

换句话说,属性表示键/值对。如果你可以在Python中将它表示为一个字典,其键是XML名称并且其值是字符串,那么无论“它”是什么,你都可以将它表示为一组属性。

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