XML属性或元素节点?

时间:2010-03-18 10:48:02

标签: xml data-structures xsd

使用元素节点的XML示例:

<?xml version="1.0" encoding="utf-8"?>
<users>
  <user>
    <name>David Smith</name>
    <phone>0441 234443</phone>
    <email>dave.s33@domain.com</email>
    <addresses>
      <address>
        <street>1 Some Street</street>
        <town>Toy Town</town>
        <country>UK</country>
      </address>
      <address>
        <street>5 New Street</street>
        <town>Lego City</town>
        <country>US</country>
      </address>
    </addresses>
  </user>
</users>

使用属性的示例XML:

<?xml version="1.0" encoding="utf-8"?>
<users>
  <user name="David Smith" phone="0441 234443" email="dave.s33@domain.com">
    <addresses>
      <address street="1 Some Street" town="Toy Town" country="UK" />
      <address street="5 New Street" town="Lego City" country="US" />
    </addresses>
  </user>
</users>

我需要根据关系数据库中的数据构建XML文件,并且无法判断我是否应该使用属性或元素。

构建XML文件时的最佳做法是什么?

5 个答案:

答案 0 :(得分:5)

我读过的更好的文章之一是“Principles of XML design: When to use elements versus attributes”,它并不试图给你一个彻头彻尾的答案,但确实提供了一些好的思考和示例。

我建议文章中的建议倾向于你的第一个设计;您可能有兴趣阅读有关代表名称的部分。

答案 1 :(得分:3)

为了帮助您做出选择,您需要了解元素和属性之间的以下差异:

  • 元素可能没有两个具有相同名称的属性。特别是,如果您使用属性,则无法为用户分配两个 phone 属性。
  • 在元素中,您可以嵌套更多子元素,就像使用地址一样。例如,您可以在用户名中嵌套名字中间名姓氏元素。使用属性,您无法执行此操作,因此属性仅适用于相对平坦的层次结构。
  • 如果使用名称空间,子元素将继承默认名称空间绑定。属性没有。
  • 子元素是有序的,属性不是:如果使用属性,则不能依赖它们保留的顺序。
  • 在元素中,您可以使用CDATA部分,这样您就不必担心转义特殊字符,例如&lt;。在属性中,您必须使用&amp; quot;转义所有引号。如果该属性是双引号,或者用&amp;'来转义所有撇号。如果属性值是单引号。

答案 2 :(得分:1)

我会考虑以下语法:

<?xml version="1.0" encoding="utf-8"?>
<users>
  <user>
    <name first-name="David" last-name="Smith" /> 
    <phone home-phone="0441 234443" />
    <email private-email="dave.s33@domain.com" />
    <addresses>
      <address street="1 Some Street" town="Toy Town" country="UK" />
      <address street="5 New Street" town="Lego City" country="US" />
    </addresses>
  </user>
</users>

我认为如果为可以重复的东西选择元素并且可以有子元素,那么看起来会更好看,而在其他情况下我个人会使用属性,因为它们可以节省大量的内存空间。正如xdib团队上面所说:

  

元素可能没有两个属性   同名。特别是,如果   你使用属性,你不能分配   两个手机属性给用户。

这就是为什么我喜欢上面的语法。我已经决定使用元素作为名称,但我有足够的选项作为属性的姓氏,我认为在这种情况下属性就足够了,因为没有更多的东西应该嵌套在它们下面。您可以拥有多个地址,但每个地址可以有一个街道和一个城镇。这就是我选择的方式。

答案 3 :(得分:0)

我只使用属性ID(在这种情况下我只将国家/地区放入属性中),当你有一些文本时它更好的元素+ CDATA(如果你确定你的文本中永远不会有特殊的字符)你可以省略cdata)。

答案 4 :(得分:-2)

我更喜欢在子元素上使用属性。