【问题标题】:What is the difference between XML data and XML metadata?XML 数据和 XML 元数据有什么区别?
【发布时间】:2017-08-22 20:39:22
【问题描述】:

我正在重建一些 XML 提要,因此我正在研究何时使用元素以及何时使用 XML 属性。

一些网站说“数据在元素中,元数据在属性中。”

那么,这两者有什么区别呢?

我们以W3Schools为例:

<note date="12/11/2002">
  <to>Tove</to>
  <from>Jani</from>
  <heading>Reminder</heading>
  <body>Don't forget me this weekend!</body>
</note>

是否应该将日期保留为 note 元素的属性?还是进入自己的元素更有意义?

<date>12/11/2002</date>

或者,把它分成多个元素有意义吗?

<date>
  <day>12</day>
  <month>11</month>
  <year>2002</year>
</date>

【问题讨论】:

  • 这个问题是我听过的关于 JSON 的最佳论据。
  • 这是为什么?您将如何使用 JSON 构建示例?到目前为止,我有以下内容,我不确定我会在哪里放置属性,例如注释 id:“notes”:[{“to”:“Tove”,“from”:“Jani”,“heading” :“提醒”、“正文”:“这个周末别忘了我!” }]
  • "notes" 有什么问题:[{"id":27, "to":"Tove", ...}] ?
  • @Ned 这没什么错。但是,值得注意的是,您失去了区分属性和元素的能力,并且在转换回 XML 时失去了区分属性和元素的能力。出于我的目的,我不得不使用 XML,因为我们已经有人依赖提要,所以 JSON 不是一个选项。

标签: xml metadata


【解决方案1】:

按照“数据在元素中,元数据在属性中。”之后,我会将 Date 设为子元素。您不需要将其分解为日、月和年,因为我认为实际上有一种方法可以在 XSD 中指定元素必须是 Date 类型。我认为这里的“元数据”示例是noteID 字段或noteType。示例:

<note id="NID0001234" type="reminder">
  <date>2002-11-12</date>
  <to>Tove</to>
  <from>Jani</from>
  <heading>Reminder</heading>
  <body>Don't forget me this weekend!</body>
</note>

更新:正如许多其他人指出的那样,它可能相当主观。我试图通过它们将如何使用来区分这两者。数据通常会呈现给用户,元数据将控制呈现,并且可以在内部用于其他目的。但总有例外……

【讨论】:

  • 老实说,我可以证明“类型”应该有自己的元素,我也可以证明 date/to/from/heading 都应该是属性。什么构成“元数据”是非常主观的,可以有很多解释。
  • “数据通常会呈现给用户,元数据将控制呈现并可能在内部用于其他目的”——经过进一步研究,我得出了相同的结论。数据(元素)可能会显示给用户;元数据(属性)对于有关数据的信息是必需的,并且不会显示给用户。属性示例:type="text";版本=“1.0”; xmlns="...";方案="http://..."; rel="替代"。
【解决方案2】:

数据和元数据之间的区别几乎完全是主观的。一个人的数据就是另一个人的元数据。 “属性中的元数据”规则源于标记世界,经验法则是,如果你删除所有标记,只留下文本,它应该是一个合理的文档。这意味着属性应该是可丢弃的,而元素是必不可少的。如果您在不理解的浏览器中显示 XML,它将被这样处理。

但是您的 XML(以及目前的大多数 XML)可能不会在不理解的浏览器中显示给用户,因此您可以使用更好的规则来设计 XML。

例如,您可以拥有多个具有相同名称的元素,但不能拥有多个属性。属性中会忽略空格,但元素中不会。

【讨论】:

  • 关于可丢弃属性的要点。这将使日期不可丢弃,因此元素。似乎属性不应该向用户显示,并且更多的是元和元素的内部。
【解决方案3】:

在决定是否对一条数据使用属性或元素时,对于使用的原则有不同的看法。例如,请参阅this old article from IBM,它列出了一堆提议的原则,然后用一个巨大的警告来装饰整篇文章,上面写着“有很多例外,这些原则并不是规定性的”(本质上)。

我认为主要是内部保持一致。在你自己的世界中保持一致,无论它有多大。你的“世界”可以是一个单一的模式——你应该在你的方法中保持一致。该模式中的每个元素都应该在哲学上是一致的。或者您的世界可能是一组相关的模式,或者它可能是特定公司发布的所有 XML 文档,甚至是行业或技术组使用的所有 XML 模式。

现在,关于您提供的样本:

<note date="12/11/2002">  
  <to>Tove</to>  
  <from>Jani</from>  
  <heading>Reminder</heading>  
  <body>Don't forget me this weekend! Remember what happenned last time you forgot!!!</body>  
</note>  

...这似乎在内部不一致,因为只提取了一条数据,而且似乎没有充分的理由这样做。

如果所有项目都是属性或都是元素会更好。一个例外:较长的身体元素可能应该始终是一个元素。这对我来说是正确的:

<note date="12/11/2002" to="Tove" from="Jani" heading="Reminder">
  <body>Don't forget me this weekend! Remember what happenned last time you forgot!!!</body>  
</note>  

将正文放入属性会损害可读性,因此建议将正文放入元素中。

请记住,空格可以在属性值中折叠(来源:我引用的那篇 IBM 文章);由此产生的硬性规则是,如果空格是有意义的,那么你应该使用一个元素。

现在,如果该 xml 片段中的标题类似于电子邮件主题,我可能也会将其分解为一个元素,因为主题可能很长。

至于关于日期的月/日/年的问题,是的,如果您需要在处理 XML 的工具中轻松访问这些单独的数据,请考虑这些因素。如果您明白我的意思,使用 xpath 语句搜索 2009 年之前的所有笔记更容易,该语句不必进行字符串解析然后字符串到数字的转换。另一方面,如果您对 XML 的使用不需要您对这些单独的数据(月、日、年)进行选择或搜索,那么请将它们合并为原始格式中的人类可读形式。


tl;dr: 几乎没有严格的规则。只要你对元素和属性的使用是一致的,其他开发者和工具就会很容易理解和使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-09
    • 2011-04-11
    • 2010-09-13
    相关资源
    最近更新 更多