2009-02-06 84 views
7

创建新的xml文件时,如何正确构建文件或以最佳方式进行构建。通过结构,在这种情况下可能不是最好的词,我的意思是如何在一个元素或一个元素的属性之间进行选择。例如,如果我创建一个包含人员列表的Person.xml文件,是它更好地做一些事情,如:你应该如何构建你的xml文件?

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

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

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

回答

5

XML文件应该(不启动圣战)如下结构它的东西Person的属性,那么它应该是这样的:

有这种做法,而不是其中最重要的包括容易的F多种原因每当您更改检索个人数据的方法时,都会对您的XSLT变换进行处理。

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

+2

在这个例子中“属性”和“数据”之间的区别是不清楚的(至少可以这么说)。另外,我没有看到为什么这些属性使得XSLT工作变得“更加困难”:使用@前缀很困难? – 2009-02-07 07:46:12

+0

Robert:我处理的是从数据库中提取一些数据的应用程序,其他数据是从XML文件中提取的。使用属性的方式,我必须将该XML转换为XML,以便将数据填入数据,然后将该XML转换为HTML。这就是为什么。 – 2009-02-07 12:52:13

2

这几乎是一种主观的东西。

如果它的数据,或东西是可以改变的,那么就应该是这样的:

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

如果

5

真的无所谓,但我决定的方式是:如果事情可以考虑自身的实体(在这个例子中,人,我做的一个元素。如果它的东西,修改实体(或。实体的属性),我做它的一个属性

例:

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

在我看来,这是雪佛兰一个类似于VS福特,或Windows VS的MacOS没有明确的赢家之道。的情况下,单纯的问题可能会产生与正确的参与者高度不稳定的“讨论”;)

简短的答案是,根据具体情况可能是合适的。有时决定因素甚至是您选择读取或更新XML中数据的库。

1

首先是做事的详细方法:一切都是一个元素。这是人们做这件事的常见方式,因为它很容易查看和解析。

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

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

我可能会做后者。

你不想要的唯一时间是如果你需要更多的XML数据或长格式的部分。

1

通常,您需要元素来表示您正在建模的“真实”信息,并保留用于“内容”信息的属性。无论个人口味

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>... 

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