我很好奇是否有标准或指南来确定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>
答案 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是一种标记语言,所以如果你剥离掉所有标签及其属性,你可能想要考虑它会留下什么。