是否有创建XML文件的标准或指南?

时间:2009-08-20 21:29:58

标签: xml formatting xml-serialization standards

我很好奇是否有标准或指南来确定xml文件中属性与元素的类型。

我也很好奇使用XMLSerializer创建xmlarray和xmlarrayitem列表。例如,如果我有以下内容:

<SomeBaseTag>
   <Item1 Attr11=”one” Attr12=”two” />
   <Item1 Attr11=”one” Attr12=”two” />
   <Item1 Attr11=”one” Attr12=”two” />
   <Item2 Attr21=”one” Attr22=”two” />
   <Item2 Attr21=”one” Attr22=”two” />
   <Item2 Attr21=”one” Attr22=”two” />
</SomeBaseTag>

我应该将其更改为:

<SomeBaseTag>
  <Item1s>
     <Item1 Attr11=”one” Attr12=”two” />
     <Item1 Attr11=”one” Attr12=”two” />
     <Item1 Attr11=”one” Attr12=”two” />
  </Item1s>
  <Item2s>
     <Item2 Attr21=”one” Attr22=”two” />
     <Item2 Attr21=”one” Attr22=”two” />
     <Item2 Attr21=”one” Attr22=”two” />
  </Item2s>
</SomeBaseTag>

8 个答案:

答案 0 :(得分:3)

这完全取决于您尝试使用XML文档表示的语义。

例如,如果 SomeBaseTag 代表市场停滞, Item1 代表苹果, Item2 代表橙子,那么第一种格式是完全合适的。

但是,如果两个项目不同并且可以更好地分组,则第二种格式更有意义。如果 SomeBaseTag 代表基本粒子并且** Item1 ** s是费米子并且** Item2 ** s是玻色子,则会出现这种情况。

在您的示例中,两个不同的项共享相同的属性名称,这使得它们更紧密相关更合乎逻辑。

答案 1 :(得分:2)

如前所述,风格和品味是主要因素。还有其他人。

属性受限于它们可以包含的内容。例如,它们不能包含元素。此外,某些字符如“&lt;”不能出现在属性中。元素可能包含文本,其他元素或两者。

我还会提到一个具体的“风格”问题。您的XML应该是一致的。我不喜欢WSDL的一件事是大多数内容都包含在包装元素中,messages除外:

<wsdl>
    <types/>

    <message/>
    <message/>
    <message/>

    <portTypes/>
    <bindings/>
    <service/>
</wsdl>

我一直很生气,因为没有<messages/>元素。

答案 2 :(得分:1)

这是一种风格的东西 - 属性使xmls看起来更清晰,更简洁,而不是重元素。此外,它还取决于您用于解析此类xmls的工具 - 我在过去使用的一些工具在元素与属性时更容易编码。但这方面并不是什么大问题。最好保持xml更小,因为xml本身已经是详细的

答案 3 :(得分:1)

我不同意这是“品味问题”。 XML元素和属性的语义是不同的:

  • 元素顺序很重要,属性顺序不重要。
  • 允许重复元素,不包含重复属性。
  • 空格在属性中很重要,通常不在元素中。
  • 元素可以包含其他元素,属性不能包含属性或元素。
  • 忽略无法识别的属性,通常会传递无法识别的元素。

例如,编号元素通常是错误的,因为元素已经被排序。我会将您的架构更改为:

<SomeBaseTag>
    <SomeItemTag>
        <SomeAttributeTag>one</SomeAttributeTag>
        <AnotherAttributeTag>two</AnotherAttributeTag>
    </SomeItemTag>
    <SomeItemTag>
        <SomeAttributeTag>one</SomeAttributeTag>
        <AnotherAttributeTag>two</AnotherAttributeTag>
    </SomeItemTag>
</SomeBaseTag>

如果标签名称是有意义的单词,如“person”,“address”或“primeFactor”,则不是“Item”或“attribute”之类的无意义的单词。

答案 4 :(得分:1)

我觉得XML架构的设计有一些品味。但是,您提供的两种替代方案存在明显差异。

示例1:

<SomeBaseTag>   
    <Item1/>
    <Item1/>
    <Item2/>

示例2:

<SomeBaseTag>   
    <Set1>
      <Item1/>
      <Item1/>
    </Set1>
    <Set2>
        <Item2/>
    </Set2>

第一个对我来说就像一个大容器,其中包含Item1和Item2实体,在(我推测)中是一个随机或可能混合的顺序。第二个是具有两个子容器的容器,每个子容器包含一组特定类型的实体。

这种差异对您的目的而言可能并不重要。但在某些情况下,它很重要,特别是随着架构变得更加复杂。有关说明,请参阅WSDL上John Saunders的示例。

WSDL就是这样:

<wsdl>
    <types/>

    <message/>
    <message/>
    <message/>

    <portTypes/>
    <bindings/>
    <service/>
</wsdl>

假设第一级容器被“省略”。你有

<wsdl>
    <schema/>        
    <schema/>        
    <schema/>        
    <message/>
    <message/>
    <message/>

    <operation/>
    <operation/>
    <operation/>
    <binding/>
    <binding/>
    <binding/>
    <service/>
</wsdl>

此时,缺少portType,将服务与一组操作联系起来并不容易。

答案 5 :(得分:0)

这是一个品味问题。通常,这种数据最好用简洁的格式表示,比如YAML或JSON。

编辑:例如,

SomeBaseTag:
    Item1s:
        - {Attr11: one, Attr12: two}
        - {Attr11: one, Attr12: two}
    Item2s:
        - {Attr21: one, Attr22: two}
        - {Attr21: one, Attr22: two}

答案 6 :(得分:0)

听起来您想要创建一些可以用来衡量XML的定义。如果是这种情况,我建议你学习XML Schema。它是定义XML结构的绝佳工具,甚至可以用于创建完整的语言。在这种情况下,它类似于DOCTYPE,除了从Schema生成的XML自我意识到自己的结构定义。如果XML包含的数据是从包含它的元素的层次结构中定义的,那么这一点很重要。

就属性而言,一般规则是使用元素来包含数据而不是属性。使用Schema定义的元素可以指定数据类型约束以及前面描述的结构质量。使用属性的好处是简洁。属性可以很容易地取代原本需要嵌套元素2到4深度描述的内容。

答案 7 :(得分:-1)

我同意所有人关于“品味问题”的事情,但我还要考虑另外一件事。毕竟,XML是一种标记语言,所以如果你剥离掉所有标签及其属性,你可能想要考虑它会留下什么。