XML元素与属性

时间:2010-01-20 17:16:15

标签: xml

  

可能重复:
  Should I use Elements or Attributes in XML?

我从来没有弄清楚何时使用xml属性。我总是使用元素。我刚看了this w3schools article。文章指出使用属性是不好的做法,因为:

  • 属性不能包含多个值(子元素可以)
  • 属性不易扩展(用于将来的更改)
  • 属性无法描述结构(子元素可以)
  • 属性更难以通过程序代码进行操作
  • 属性值不容易针对DTD进行测试

它指出的唯一例外是当您为标记分配ID时。

这是对的吗?为什么属性甚至存在呢?这是xml的设计错误吗?这里有什么我想念的吗?

我能想到使用属性的唯一原因是一对一的关系。即:名称。但它必须是与原始(或字符串)的一对一关系。因为将来你不想把它分成几个不同的部分是很重要的。即:

<date> May 23, 2001 </date>

为:

<date>
   <month> May </month>
   <d> 23 </d>
   <yr> 2001 </yr>
</date>

因为使用属性无法做到这一点。

加分问题:在日期示例中可以执行以下操作:

<date>
   <default> May 23, 200 </default>
   <month> May </month>
   <d> 23 </d>
   <yr> 2001 </yr>
</date>

为未来的应用程序提供更多(或不同)的信息,同时仍然以相同的格式提供现有应用程序?或者你必须这样做:

<date> May 23, 2001 </date>
<NEWdate>
   <month> May </month>
   <d> 23 </d>
   <yr> 2001 </yr>
</NEWdate>

9 个答案:

答案 0 :(得分:12)

当您想要将信息附加到其他信息时,属性很好,也许是为了描述信息应该如何解释。例如:

<speed unit="mph">65</speed>

答案 1 :(得分:2)

您列出的有关元素的要点是正确的,我会添加以下内容:

    当您需要比较文件的修订版时,
  • 元素通常会产生更漂亮(更易读)的差异

但有时使用元素来建模数据点是过度的 - 特别是当你在单个父元素中有很多小的,异构的数据点时。使用属性来处理简单事物可以提高可读性。有些人可能会争辩说XML不可读或意图被人类阅读/编辑......但我一直这样做。

考虑这个例子(基本超链接):

<a href="http://www.htmlhelp.com/" title="Help Information" target="_top">Web Design Group</a>

如果你不得不这样写或读它,你会喜欢它吗?

<a>
    <href>http://www.htmlhelp.com/</href>
    <title>Help Information</title>
    <target>_top</target>
    <text>Web Design Group</text>
</a>

对我来说,这看起来像很多噪音。

答案 2 :(得分:2)

属性只是元素的属性。如果你需要嵌套多个元素,那么你使用元素。在你的日期示例中,我通常只使用属性,因为它更小。

<date month="12" day="31" year="2009"/>

如果更容易处理和更小的存储和通过电线发送,并且可以说更容易让人阅读。日期永远不会有多天,几个月或几年,所以没有理由将它们作为元素。

答案 3 :(得分:2)

想一下联系信息块......

<!-- attribute version -->
<person name="Matt" age="27">
    <phone type="mobile" value="1234567890" />
    <phone type="work" value="1234560987" />
    <address type="home" 
             city="NoWhere" 
             state="OH" 
             street="123 Lost Ave." 
             zipcode="12345" />
</person>

<!-- element version -->
<person>
    <name>Matt</name>
    <age>27</age>
    <phone>
        <type>mobile</type>
        <value>1234567890</value>
    </phone>
    <phone>
        <type>work</type>
        <value>1234560987</value>
    </phone>
    <address>
        <type>home</type> 
        <city>NoWhere</city>
        <state>OH</state>
        <street>123 Lost Ave.</street>
        <zipcode>12345</zipcode>
    </address>
</person>

...你可以把它们扩展成元素。但是,如果您正在处理数百个,甚至数百万个记录,则结束标记的额外开销会使文件膨胀。这可能会导致内存/处理器受限系统出现问题和/或数据链速度变慢。使用元素乱丢XML也会使您在视觉上阅读和理解XML变得更加困难。虽然数据的视觉体验可能对传输和存储无关紧要,但对于配置和维护非常重要。

使用来自所有内容的元素可能产生的另一个问题是当您尝试使用代码库外部的数据时;你知道元素是否可以重复,或者它们是否只包含一条简单的信息,你会遇到更多困难。是的,您可以使用XSD和DTD来约束这一点,但这通常比仅仅使XML易于理解更困难。

至于你的奖金问题...... XML模式的版本控制取决于你正在开发的平台以及你的代码和平台对模式的严格程度。 XML(和二进制文件)可以非常灵活......这就是为什么XML是可扩展的。

答案 4 :(得分:2)

不要忘记将属性解析为开始标记的一部分。这意味着在解析时,您可以立即获得这些值,而不必等待close标记。另外,您不会为所有元素标记调用所有解析事件(如果您正在进行流解析)。

我更喜欢使用属性来获取有关所包含元素的元数据。例如,我想将日期表示为<date format="dd-MMM-yyyy">20-Jan-2010</date>。如果您有明确的数据元素,请继续并使它们成为属性。 <name first="Tom" last="Jones"/>适用于许多情况。

答案 5 :(得分:1)

来自w3schools文章的所有这些要点都是绝对有效和正确的。我同意 - 我几乎没有在XML文档中使用属性。

我唯一一次使用它们可能是在我需要识别实体时,例如

<Customer Id="123123">
 ....
</Customer>

但即使在这里,也是一个折腾。您可以轻松地将该ID放入<ID>123123</ID>元素。

此外,在我的情况下,由于WCF DataContractSerializer不支持XML属性(出于性能原因),这是不使用它们的另一个原因(很多):

答案 6 :(得分:0)

  

“为什么属性甚至存在?”

允许更简洁的XML代码,只是为了保存您的输入。当然,任何包含属性

的XML文件
<element attr1="val1" attr2="val2" ... attrN="valN">
   <nestedElement>
     ...
   </nestedElement>
</element>

可以很容易地转换为“无属性”的:

<element>
       <attributes>
         <attr1>val1</attr1>
         <attr2>val2</attr2>
         ...
         <attrN>valN</attrN>
       </attributes>
       <nestedElement>
         ...
       </nestedElement>
    </element>

答案 7 :(得分:0)

这个问题已经让我抓狂了。对我来说,这是一个语义问题。这对我来说似乎更自然

<page size="a4">

大于

<page>
  <size>a4</size>
</page>

答案 8 :(得分:0)

我通常使用属性作为使节点唯一的最小字段集。换句话说,它们代表了主键。如果您需要将XML与关系数据库相关联,这会使一些事情变得更容易。