您应该如何构造xml文件?

您应该如何构造xml文件?,xml,Xml,当创建一个新的xml文件时,如何正确地或以最好的方式构造文件。所谓结构,在本例中可能不是最好的词,我的意思是如何在使某个东西成为元素或元素的属性之间进行选择。例如,如果我创建了一个Person.xml文件,其中包含一个人员列表,那么执行以下操作是否更好: <Person> <FirstName>John</FirstName> <LastName>Doe</LastName> <Age>23</

当创建一个新的xml文件时,如何正确地或以最好的方式构造文件。所谓结构,在本例中可能不是最好的词,我的意思是如何在使某个东西成为元素或元素的属性之间进行选择。例如,如果我创建了一个Person.xml文件,其中包含一个人员列表,那么执行以下操作是否更好:

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

约翰
雌鹿
23
还是做这样的事情更好,或者这有什么关系

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

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

XML文件(不是为了发动圣战)的结构应如下所示:

如果是数据或可以更改的内容,则应如下所示:

<Person>
  <FirstName>John</FirstName>
  <LastName>Smith</LastName>
  <Age>23</Age>
</Person>
<Person Type="Human">
  <FirstName>John</FirstName>
  <LastName>Smith</LastName>
  <Age>23</Age>
</Person>
这种做法有多种原因,其中最重要的一个原因是,只要更改检索个人数据的方法,就可以轻松地修复XSLT转换


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

真的不重要,但我的决定方式是:如果某个对象本身可以被视为一个实体(在本例中,Person,我将其设置为元素。如果它是修改实体(或实体属性)的内容,我将其设置为属性

例如:

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

在我看来,这类似于雪佛兰vs福特,或Windows vs MacOS。在所有情况下都没有明确的赢家,仅仅一个问题就可能引发与正确参与者的高度不稳定的“讨论”。)

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

以下是一个关于XML设计原则的示例:


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

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

      <Person FirstName="John" LastName="Doe" Age="23" />
      
      
      
      我可能会选择后者


      唯一不希望出现这种情况的是,如果您需要在其中包含更多xml数据或长格式的节。

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

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

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

      • 值:数字、字符串、日期等,但不是多属性对象
      • 唯一名称:元素上的每个属性名称都必须是唯一的。如果元素表示的对象可以有多个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>
      
      
      约翰
      Q
      史密斯
      
      关于元素代表信息,属性代表元信息的普遍看法:这通常是一个很好的建议。迷信往往会把你带到不好的地方

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

      <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>...
      
      
      123-45-6789
      123
      123-456-7890
      ...
      

      以此类推。猜猜当您尝试编写一个基于
      Type
      属性失败对
      Person
      元素强制执行不同规则的架构时会发生什么。架构绑定到元素名称。所有
      Person
      元素必须具有相同的架构。在这种情况下,元素应命名为
      Employee
      ,并且
      Customer

      我自己从来没有明确地用过这些词,但我喜欢这个问题的简洁决策树。在这个例子中,“属性”和“数据”之间的区别是不清楚的(至少可以这么说)。而且,我看不出为什么属性会让事情变得“艰难”在使用XSLT时,使用@前缀有那么困难吗?Robert:我处理的应用程序中,一些数据从数据库中提取,而其他数据则从XML文件中提取。按照属性的方式,我必须将XML转换为我需要的XML