创建新的xml文件时,如何正确地构建文件或以最佳方式构建文件。通过结构,在这种情况下可能不是最好的词,我的意思是如何在制作元素或元素属性之间做出选择。例如,如果我创建一个包含人员列表的Person.xml文件,那么最好是这样做:
<Person>
<FirstName>John</FirstName>
<LastName>Doe</LastName>
<Age>23</Age>
</Person>
或者做这样的事情或者甚至更重要吗?
<Person FirstName="John" LastName="Doe" Age="23"></Person>
答案 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)
无论个人品味如何,这都是一系列基本问题:
使用属性在排序不重要时将值映射到唯一名称。否则,请使用元素。
示例:如果要在(例如)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
元素必须具有相同的架构。在这种情况下,元素应命名为Employee
和Customer
。