【问题标题】:How should you structure your xml file? [duplicate]你应该如何构建你的 xml 文件? [复制]
【发布时间】:2009-02-06 18:08:20
【问题描述】:

当创建一个新的 xml 文件时,如何正确或最好的方式构建文件。通过结构,在这种情况下可能不是最好的词,我的意思是人们如何在使某物成为元素或元素的属性之间做出选择。例如,如果我创建了一个包含人员列表的 Person.xml 文件,是否最好执行以下操作:

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

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

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

【问题讨论】:

    标签: xml


    【解决方案1】:

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

    例子:

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

    【讨论】:

    • 我从来没有为自己明确表达过这些词,但我喜欢这个问题的简洁决策树。
    【解决方案2】:

    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 转换。

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

    【讨论】:

    • 这个例子中“属性”和“数据”之间的区别是不清楚的(至少可以这么说)。此外,我看不出为什么在使用 XSLT 时属性会使事情变得“更难”:使用 @ 前缀有那么困难吗?
    • Robert:我处理一个应用程序,其中一些数据是从数据库中提取的,而其他数据是从 XML 文件中提取的。使用 Attributes 的方式,我必须将该 XML 转换为可以填充数据的 XML,然后将该 XML 转换为 HTML。这就是为什么。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          【解决方案6】:

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

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

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

          我可能会选择后者。

          您唯一不希望出现这种情况的情况是您需要在内部包含更多 xml 数据或长格式的部分。

          【讨论】:

            【解决方案7】:

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

            【讨论】:

              【解决方案8】:

              不管个人喜好如何,以下是一组基本问题:

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

              • 值:数字、字符串、日期等,但不是多属性对象。
              • 唯一名称:元素上的每个属性名称都必须是唯一的。如果一个元素表示的事物可以有多个 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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2012-08-21
                • 2010-09-12
                • 1970-01-01
                • 2012-03-18
                • 2023-03-31
                • 1970-01-01
                相关资源
                最近更新 更多