代码之家  ›  专栏  ›  技术社区  ›  sixtyfootersdude

XML元素与属性[重复]

xml
  •  10
  • sixtyfootersdude  · 技术社区  · 15 年前

    这个问题已经有了答案:

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

    我从来没有弄清楚什么时候使用XML属性。我 总是 使用元素。我刚读 this w3schools article . 文章指出,使用属性是一种不好的做法,因为:

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

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

    这是正确的吗?为什么属性会存在呢?这是XML的设计错误吗?我这里有什么东西不见了吗?

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

    <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 回复  |  直到 15 年前
        1
  •  12
  •   Guffa    15 年前

    当您想将信息附加到其他信息上时,属性是很好的,可能是为了描述应该如何解释这些信息。例如:

    <speed unit="mph">65</speed>
    
        2
  •  2
  •   Drew Wills    15 年前

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

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

    但是有时使用一个元素来建模一个数据点是过分的——特别是当您在一个父元素中有很多小的、异构的数据点时。将属性用于简单的事情可以提高可读性。有些人可能会争辩说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>
    

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

        3
  •  2
  •   TMN    15 年前

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

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

        4
  •  2
  •   user177800    13 年前

    属性就是元素的属性。如果需要嵌套多个元素,则使用元素。在您的日期示例中,我通常只使用属性,因为它比较小。

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

    如果更容易处理和更小的存储和发送线,以及可以说更容易为人类阅读。一个日期永远不会有多天、多月或多年,因此没有理由将其作为元素。

        5
  •  2
  •   Chad    11 年前

    想想联系方式…

    <!-- 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可扩展的真正原因。

        6
  •  1
  •   marc_s HarisH Sharma    15 年前

    W3Schools文章中的所有观点都是绝对有效和正确的。我同意——我几乎从不在XML文档中使用属性。

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

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

    但即使在这里,这也是一个折腾。你可以很容易地把身份证 <ID>123123</ID> 元素。

    此外,在我的例子中,由于WCF DataContractSerializer不支持XML属性(出于性能方面的原因),这也是不使用它们的另一个原因(很多):

        7
  •  0
  •   Igor Korkhov    15 年前

    “为什么属性会存在?”

    为了让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>
    
        8
  •  0
  •   mcrisc    15 年前

    这个问题也让我抓耳挠腮。对我来说,这是一个语义学的问题。我这样做似乎更自然

    <page size="a4">
    

    <page>
      <size>a4</size>
    </page>
    
        9
  •  0
  •   knipknap    15 年前

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