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文档的结构时,如何决定何时使用属性或元素?


当前回答

存储对象属性的两种方法都是完全有效的。你应该放弃实用主义的考虑。试着回答以下问题:

哪种表示方式可以更快地生成数据解析? 哪种表示法可以更快地传输数据? 可读性重要吗? ...

其他回答

“XML”代表“可扩展标记语言”。标记语言意味着数据是文本,用关于结构或格式的元数据标记。

XHTML是按预期方式使用XML的一个例子:

<p><span lang="es">El Jefe</span> insists that you
    <em class="urgent">MUST</em> complete your project by Friday.</p>

这里,元素和属性之间的区别很明显。文本元素显示在浏览器中,属性是关于如何显示它们的指令(尽管有一些标记不是这样工作的)。

当XML不是作为标记语言,而是作为数据序列化语言使用时,就会出现混淆,在这种情况下,“数据”和“元数据”之间的区别更加模糊。因此,元素和属性之间的选择或多或少是任意的,除非不能用属性表示(参见feenster的回答)。

我同意芬斯特的观点。如果可以的话,远离属性。元素是进化友好的,并且在web服务工具包之间具有更强的互操作性。您永远不会发现这些工具包使用属性序列化您的请求/响应消息。这也是有意义的,因为我们的消息是web服务工具包的数据(而不是元数据)。

如何利用我们来之不易的面向对象的直觉?我通常发现,思考哪个是对象,哪个是对象的属性,或者它指的是哪个对象是很直接的。

任何直观上作为对象有意义的东西都应该作为元素。它的属性(或属性)将是xml中这些元素的属性或带有attribute的子元素。

我认为对于更简单的情况,比如在例子中,面向对象的类比可以很好地找出哪个是元素,哪个是元素的属性。

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

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

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

只是对一些不好的信息做一些更正:

属性可以包含任何字符数据。< > & " '需要转义到&lt;&gt;,“;事情就让它,,,分别。如果您使用XML库,它将为您处理这些问题。

一个属性可以包含二进制数据,如图像,如果你真的需要,只需通过base64编码并将其设置为data: URL。

@feenster:在IDS或NAMES的情况下,属性可以包含空格分隔的多个项,其中包括数字。吹毛求疵,但这最终可以节省空间。

使用属性可以保持XML与JSON的竞争力。参见脂肪加价:每次减少一卡路里的脂肪加价神话。