你应该如何构建你的xml文件?

时间:2009-02-06 18:08:21

标签: xml

创建新的xml文件时,如何正确地构建文件或以最佳方式构建文件。通过结构,在这种情况下可能不是最好的词,我的意思是如何在制作元素或元素属性之间做出选择。例如,如果我创建一个包含人员列表的Person.xml文件,那么最好是这样做:

<Person>
    <FirstName>John</FirstName>
    <LastName>Doe</LastName>
    <Age>23</Age>
</Person>

或者做这样的事情或者甚至更重要吗?

<Person FirstName="John" LastName="Doe" Age="23"></Person>

8 个答案:

答案 0 :(得分:5)

XML文件应该(不是开始圣战)的结构如下:

如果是数据或可以更改的内容,那么它应该是这样的:

<Person>
  <FirstName>John</FirstName>
  <LastName>Smith</LastName>
  <Age>23</Age>
</Person>

如果它是事物Person的属性,那么它应该是这样的:

<Person Type="Human">
  <FirstName>John</FirstName>
  <LastName>Smith</LastName>
  <Age>23</Age>
</Person>

这种做法有多种原因,其中最重要的原因包括每当您更改检索个人数据的方法时,都可以轻松修复XSLT转换。

这才是真正重要的部分:属性定义有关数据的信息(人员类型),而数据是用来填补这些漏洞的东西。如果您决定如何更改填充这些漏洞的方式,那么当您希望稍后转换XML时,如果您已将它们设为“属性”而非“数据”,则会变得更加困难。

答案 1 :(得分:5)

真的没关系,但我决定的方式是:如果某些东西可以被认为是一个实体(在这个例子中,Person,我将它作为一个元素。如果它是修改实体的东西(或属性) (实体),我把它作为属性。

示例:

<Person FirstName="John" LastName="Doe" Age="23">
    <Clothing wet="No">
        <Shirt colour="Red" />
    </Clothing>
</Person>

答案 2 :(得分:2)

这几乎是一个主观的事情。

答案 3 :(得分:2)

答案 4 :(得分:1)

在我看来,这类似于雪佛兰与福特,或Windows与MacOS。对于所有情况都没有明显的赢家,而单纯的问题可能会与合适的参与者产生极不稳定的“讨论”。 ;)

简短的回答是,根据具体情况,两者都可能是合适的。有时,决定因素是您选择哪个库来读取或更新XML中的数据。

答案 5 :(得分:1)

第一种是冗长的做事方式:一切都是元素。这是人们这样做的常见方式,因为它很容易查看和解析。

然而,出于这个原因引入了属性:它们是关于元素的一些信息。所以,你的第二个例子完全可以接受。事实上,你甚至可以缩短它:

<Person FirstName="John" LastName="Doe" Age="23" />

我可能会做后者。

唯一一次你不想要这个是你需要在里面有更多的xml数据,或者是长格式的部分。

答案 6 :(得分:1)

通常,您希望元素表示您正在建模的“真实”信息,并保留“元”信息的属性 - 这些信息限定了内容。

答案 7 :(得分:1)

无论个人品味如何,这都是一系列基本问题:

使用属性在排序不重要时将值映射到唯一名称。否则,请使用元素。

  • 值:数字,字符串,日期等,但不包含多属性对象。
  • 唯一名称:元素上的每个属性名称必须是唯一的。如果元素表示的事物可以有多个与之关联的Foo,则Foo不应该是属性。
  • 订购并不重要:应用程序不能依赖于按特定顺序呈现给流程的值。

示例:如果要在(例如)ADO.NET和XML之间往返数据,是否应将列值存储在属性或元素中? (暂时不要介意ADO.NET会为你做这件事。)好吧,列名唯一地映射到值,列值是可序列化的数据类型。那么肯定,为什么不这样做呢?

<Person FirstName="John" MiddleName="Q." LastName="Smith"/>

但实际上这是一个破坏信息的转变。列出现在ADO.NET记录中的顺序非常重要。如果在转换之前第2列中有某些内容,则应该在第2列之后。将它们转换为属性将丢失此信息。 (例如,我知道一个DOM实现,它按名称按字母顺序检索属性。)

这就是为什么ADO.NET代表这样的行,虽然它是详细的:

<Person>
   <FirstName>John</FirstName>
   <MiddleName>Q.</MiddleName>
   <LastName>Smith</LastName>
</Person>

至于元素用于信息的常识,属性用于元信息:这通常是非常好的建议。它也常常只是迷信会导致你进入不好的地方。

首先,元信息可能需要包含与同一名称相关联的多个值。例如,您可能希望使用将使用它的页面列表标记元素:

<Person Pages="B1,B2,B3,B4">
    <FirstName>John...

曾经尝试编写一个解析逗号分隔列表的XSLT模板吗?通过这样做你会学到很多东西,但这可能不是你想知道的。

另一方面,那些不知道他们反对的XML设计师让这个建议引导他们在元素的标签名称中加入一个属性。例如:

<Person Type="Employee">
    <SSN>123-45-6789</SSN>
    <Extension>123</Extension>
</Person>
<Person Type="Customer">
    <PhoneNumber>123-456-7890</PhoneNumber>
    <BillingAddress>...

等等。猜测当您尝试编写基于Person属性对Type元素强制执行不同规则的架构时会发生什么?失败。模式绑定到元素名称。所有Person元素必须具有相同的架构。在这种情况下,元素应命名为EmployeeCustomer