2024-09-15 07:00:01

XML属性vs XML元素

在工作中,我们被要求创建XML文件来将数据传递给另一个脱机应用程序,然后该应用程序将创建第二个XML文件来传递回去,以更新我们的一些数据。在这个过程中,我们一直在与另一个应用程序的团队讨论XML文件的结构。

我提出的样本基本上是这样的:

<INVENTORY>
   <ITEM serialNumber="something" location="something" barcode="something">
      <TYPE modelNumber="something" vendor="something"/> 
   </ITEM>
</INVENTORY>

另一个团队说,这不是行业标准,属性应该只用于元数据。他们建议:

<INVENTORY>
   <ITEM>
      <SERIALNUMBER>something</SERIALNUMBER>
      <LOCATION>something</LOCATION>
      <BARCODE>something</BARCODE>
      <TYPE>
         <MODELNUMBER>something</MODELNUMBER>
         <VENDOR>something</VENDOR>
      </TYPE>
   </ITEM>
</INVENTORY>

我建议使用第一个方法的原因是,创建的文件的大小要小得多。在传输过程中,文件中将有大约80000个项目。事实上,他们的建议比我的建议大三倍。我搜索了提到的神秘的“行业标准”,但我能找到的最接近的是XML属性应该只用于元数据,但争论的焦点是什么才是实际的元数据。

在冗长的解释(抱歉)之后,如何确定什么是元数据,以及在设计XML文档的结构时,如何决定何时使用属性或元素?


当前回答

我的经验是这样的:

属性是自包含的东西,例如颜色、ID、名称。 元素是具有或可能具有自己的属性或包含其他元素的东西。

你的也很接近了。我会这样做:

编辑:根据下面的反馈更新了原始示例。

  <ITEM serialNumber="something">
      <BARCODE encoding="Code39">something</BARCODE>
      <LOCATION>XYX</LOCATION>
      <TYPE modelNumber="something">
         <VENDOR>YYZ</VENDOR>
      </TYPE>
   </ITEM>

其他回答

这两种方式都有争议,但您的同事认为XML应该用于“标记”或围绕实际数据的元数据,这一点是正确的。对您来说,在用XML建模域时,有时很难确定元数据和数据之间的界限。实际上,我所做的是假装标记中的任何内容都是隐藏的,只有标记之外的数据是可读的。这份文件在这方面有意义吗?

XML是出了名的庞大。对于运输和存储,如果你能负担得起处理能力,强烈建议压缩。XML压缩得很好,有时压缩得非常好,因为它具有重复性。我曾经把大文件压缩到不到原始大小的5%。

支持您立场的另一点是,当其他团队在争论样式时(大多数XML工具处理全属性文档就像处理全#PCDATA文档一样容易),您在争论实用性。虽然不能完全忽视风格,但技术优点应该更重要。

属性的一些问题是:

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

如果您使用属性作为数据的容器,那么您最终会得到难以阅读和维护的文档。尝试使用元素来描述数据。仅在提供与数据无关的信息时使用属性。

不要像这样结束(这不是XML应该使用的方式):

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

来源:http://www.w3schools.com/xml/xml_dtd_el_vs_attr.asp

如果有疑问,KISS——当您没有明确的理由使用属性时,为什么要混合使用属性和元素呢?如果稍后决定定义一个XSD,那么最终也会更简洁。然后,如果稍后决定从XSD生成类结构,也会更简单。

这在HTML中非常明显,属性和标记的差异可以清楚地看到:

所有数据都在标记之间 属性用于描述数据的特征(例如格式)

如果只有XML格式的纯数据,区别就不那么明显了。数据可以位于标记之间,也可以作为属性。

大多数数据应该位于标记之间。

你可以把数据分为两类:数据和“元数据”,其中元数据不是记录的一部分,你想要呈现,但像“格式版本”,“创建日期”等。

<customer format="">
     <name></name>
     ...
</customer>

有人也可以说:“使用属性来描述标记,使用标记来提供数据本身。”

使用元素作为数据,使用属性作为元数据(关于元素数据的数据)。

如果一个元素在选择字符串中显示为谓词,那么很明显它应该是一个属性。同样地,如果一个属性从未被用作谓词,那么它可能不是有用的元数据。

请记住,XML应该是机器可读的,而不是人类可读的,对于大型文档来说,XML压缩得非常好。