我应该在XML中使用元素还是属性?

Ibn*_*eed 70 xml xml-attribute

我正在学习W3Schools的XML属性.

作者提到了以下内容(强调我的):

XML元素与属性

<person sex="female">
  <firstname>Anna</firstname>
  <lastname>Smith</lastname>
</person>
Run Code Online (Sandbox Code Playgroud)
<person>
  <sex>female</sex>
  <firstname>Anna</firstname>
  <lastname>Smith</lastname>
</person>
Run Code Online (Sandbox Code Playgroud)

在第一个例子中,性是一种属性.在最后,性是一个元素.两个示例都提供相同的信息.

关于何时使用属性以及何时使用元素没有规则.属性在HTML中很方便.在XML中,我的建议是避免它们.请改用元素.

避免使用XML属性?

使用属性的一些问题是:

  • 属性不能包含多个值(元素可以)
  • 属性不能包含树结构(元素可以)
  • 属性不易扩展(用于将来的更改)

属性很难阅读和维护.使用元素数据.使用属性来获取与数据无关的信息.

那么作者的观点是一个着名的,或者这是XML中的最佳实践?

应该避免使用XML中的属性吗?

W3Schools还提到了以下内容(强调我的):

元数据的XML属性

有时ID引用分配给元素.这些ID可用于识别XML元素,其方式与HTML中的ID属性非常相似.此示例演示了这一点:

<messages>
  <note id="501">
    <to>Tove</to>
    <from>Jani</from>
    <heading>Reminder</heading>
    <body>Don't forget me this weekend!</body>
  </note>
  <note id="502">
    <to>Jani</to>
    <from>Tove</from>
    <heading>Re: Reminder</heading>
    <body>I will not</body>
  </note>
</messages>
Run Code Online (Sandbox Code Playgroud)

上面的ID只是一个标识符,用于标识不同的注释.它不是音符本身的一部分.

我在这里要说的是元数据(有关数据的数据)应该作为属性存储,并且数据本身应该存储为元素.

Pra*_*nth 56

属性或元素的使用通常由您尝试建模的数据决定.

例如,如果某个实体是PART数据,则最好是使一个元素.例如,员工的姓名是员工数据的重要组成部分.

现在,如果您想传达关于数据的METADATA(提供有关数据的附加信息的东西),但实际上并不是数据的一部分,那么最好将其作为属性.例如,假设每个员工都有一个后端处理所需的GUID,然后使其成为一个属性更好.(GUID不会向看到xml的人传达真正有用的信息,但可能是其他目的所必需的)

没有规则可以说某事应该是属性或元素.

它不需要不惜一切代价来避免属性.有时它们比元素更容易建模.这实际上取决于您尝试表示的数据.

  • 属性不仅仅适用于元数据 - 它们还可用于任何类型的非分层数据。请参阅威廉·沃尔塞斯的回答。 (3认同)

Wil*_*eth 24

在OP之后的两年,我的0.02正好相反.让我解释.

  1. 在对类似数据和该数据的属性进行分组时使用元素.
  2. 不要将元素用于一切.
  3. 如果数据重复(1到多个),它可能是一个元素
  4. 如果数据从不重复,只有在与其他内容相关时才有意义,它就是一个属性.
  5. 如果数据没有其他属性(即名称),那么它就是一个属性
  6. 将元素组合在一起以支持集合解析(即/ xml /字符)
  7. 重用类似的元素名称以支持解析数据
  8. 永远,永远,使用数字的元素名称显示位置.(即character1,character2)这种做法使解析非常困难(参见#6,解析代码必须/ character1,/ character2等,而不仅仅是/字符.

考虑另一种方式:

  • 首先将所有数据都视为属性.
  • 逻辑上将属性分组为元素.如果您知道自己的数据,则很少需要将属性转换为元素.您可能已经知道何时需要元素(集合或重复数据)
  • 逻辑上将元素组合在一起
  • 当你遇到需要扩展的情况时,根据上面一个过程的逻辑结构添加新的元素/属性.添加新的子元素集合不会"破坏"您的设计,并且随着时间的推移将更容易阅读.

例如,看一个简单的书籍和主要人物集合,标题将永远不会有"孩子",这是一个简单的元素.每个角色都有名字和年龄.

    <book title='Hitchhiker&apos;s Guide to the Galaxy' author='Douglas Adams'>
        <character name='Zaphod Beeblebrox' age='100'/>
        <character name='Arthur Dent' age='42'/>
        <character name='Ford Prefect' age='182'/>
    </book>

    <book title='On the Road' author='Jack Kerouac'>
        <character name='Dean Moriarty' age='30'/>
        <character name='Old Bull Lee' age='42'/>
        <character name='Sal Paradise' age='42'/>
    </book>
Run Code Online (Sandbox Code Playgroud)

你可以说一本书可能有多位作者.好的,只需通过添加新的作者元素进行扩展(可选择删除原始的@author).当然,你已经破坏了原有的结构,但在实践中它非常罕见,并且易于解决.假设单个作者的原始XML的任何消费者都必须进行更改(他们可能正在更改其数据库以将作者从"book"表中的列移动到"author"表).

<book title='Hitchhiker&apos;s Guide to the Galaxy'>
    <author name='Douglas Adams'/>
    <author name='Some Other Guy'/>
    <character name='Zaphod Beeblebrox' age='100'/>
    <character name='Arthur Dent' age='42'>
    <character name='Ford Prefect' age='182'/>
</book>
Run Code Online (Sandbox Code Playgroud)

  • 另外 2 个要避免的经典。1) 切勿命名元素名称 &lt;attribute&gt;。2)避免以下情况。&lt;attribute name='Name' value='Douglas Adams'/&gt;,使用 &lt;author name='Douglas Adams'/&gt;。谢什。 (3认同)

fly*_*ire 21

同样重要的是,将信息放入属性可以减少冗长的XML.

相比

<person name="John" age="23" sex="m"/>
Run Code Online (Sandbox Code Playgroud)

反对

<person>
    <name>
        John
    </name>
    <age>
        <years>
            23
        </years>
    </age>
    <sex>
        m
    </sex>
</person>
Run Code Online (Sandbox Code Playgroud)

是的,这有点偏颇和夸张,但你明白了

  • 如果你需要包括约翰的五个孩子和他们的年龄怎么办? (4认同)
  • @dbasnett然后在单个<person>元素下为每个子元素创建一个子元素.这两者并不是唯一的.如果您将元素视为"对象"并将该属性视为该对象中的"数据点",则可以轻松决定何时使用每个元素. (4认同)
  • @Ibn Saeed,我认为它不复杂.从XML或元素中获取属性非常简单. (3认同)
  • 我同意,尤其是对于非常大的文档,所有的空白都让它们很难阅读。 (3认同)

Gaj*_*jus 10

我用谷歌搜索了确切的问题.首先,我登陆了这篇文章,http://www.ibm.com/developerworks/library/x-eleatt/index.html.虽然,对于这样一个简单的问题,感觉太长了.无论如何,我已经阅读了关于这个主题的所有答案,但没有找到令人满意的总结.因此,我回到后一篇文章.以下是摘要:

我何时使用元素?何时使用属性来显示信息?

  • 如果有问题的信息本身可以用元素标记,则将其放在元素中.
  • 如果信息适用于属性表单,但最终可能在同一元素上作为同名的多个属性,请改用子元素.
  • 如果要求信息采用标准的类DTD属性类型(如ID,IDREF或ENTITY),请使用属性.
  • 如果不应为空白区域标准化信息,请使用元素.(XML处理器以可以更改属性值的原始文本的方式规范化属性.)

核心内容原则

如果您认为有问题的信息是XML中表达或传达的基本材料的一部分,请将其放在元素中.如果您认为信息是主要通信的外围或附带信息,或者纯粹是为了帮助应用程序处理主要通信,请使用属性.

结构化信息原理

如果信息以结构化形式表示,特别是如果结构可以是可扩展的,则使用元素.如果信息表示为原子令牌,请使用属性.

可读性原则

如果信息旨在被人阅读和理解,请使用元素.如果信息最容易被机器理解和消化,请使用属性.

元素/属性绑定原理

如果您需要使用其他属性修改其值,请使用该元素.[..]让一个属性修改另一个属性几乎总是一个可怕的想法.

这是文章中重要部分的简短摘要.如果您希望查看每个案例的示例和完整描述,请参阅原始文章.

  • 按照链接中提供的信息让我省了很多麻烦。是的,它会产生更冗长的 XML,但它是值得的。遵循这些原则,就很难出错。 (3认同)

Rob*_*ney 5

属性模型映射.元素上的一组属性直接同构化到名称/值映射中,其中值是文本或任何可序列化的值类型.例如,在C#中,任何Dictionary<string, string>对象都可以表示为XML属性列表,反之亦然.

这显然不是元素的情况.虽然您始终可以将名称/值映射转换为一组元素,但反之则不然,例如:

<map>
   <key1>value</key1>
   <key1>another value</key1>
   <key2>a third value</key2>
</map>
Run Code Online (Sandbox Code Playgroud)

如果将其转换为地图,您将丢失两件事:与之关联的多个值key1以及key1之前出现的事实key2.

如果您查看用于以这种格式更新信息的DOM代码,这一点的重要性将变得更加清晰.例如,写这个是微不足道的:

foreach (string key in map.Keys)
{
   mapElement.SetAttribute(key, map[key]);
}
Run Code Online (Sandbox Code Playgroud)

该代码简洁明了.与之形成鲜明对比,比方说:

foreach (string key in map.Keys)
{
   keyElement = mapElement.SelectSingleNode(key);
   if (keyElement == null)
   {
      keyElement = mapElement.OwnerDocument.CreateElement(key);
      mapElement.AppendChild(keyElement);
   }
   keyElement.InnerText = value;
}
Run Code Online (Sandbox Code Playgroud)


Cox*_*oxy 5

您不能将 CDATA 放在属性中。根据我的经验,您迟早会想要将单引号、双引号和/或整个 XML 文档放入“成员”中,如果它是一个属性,您将诅咒使用属性的人的元素。

注意:我在 XML 方面的经验主要涉及清理其他人的。这些人似乎遵循了一句古老的格言“XML 就像暴力。如果使用它还没有解决您的问题,那么您还没有使用足够的东西”。

  • 如果您使用 DOM 进行构建,则在属性中放置单双引号不是问题。如果您将 XML 构建为字符串,那么您就会面临大量其他问题。 (2认同)