是否有创建XML文件的标准或指南?
我很好奇,是否有标准或指南来确定xml文件中的属性和元素应该是什么类型的东西 我还对使用XMLSerializer创建xmlarray和xmlarrayitem列表感到好奇。例如,如果我有以下内容:是否有创建XML文件的标准或指南?,xml,formatting,xml-serialization,standards,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” /
<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>
这是品味的问题。通常,这类数据最好用不太详细的格式表示,比如YAML或JSON 编辑:例如
SomeBaseTag:
Item1s:
- {Attr11: one, Attr12: two}
- {Attr11: one, Attr12: two}
Item2s:
- {Attr21: one, Attr22: two}
- {Attr21: one, Attr22: two}
这是一种风格——属性使XML看起来比重元素的对应项更干净、更不冗长。此外,它还取决于您用于解析此类XML的工具——当它是元素vs属性时,我在过去使用的一些工具更容易编码。但这方面并不是什么大问题。最好保持xml较小,因为xml本身已经很详细了,这完全取决于您试图用xml文档表示的内容的语义 例如,如果您的
SomeBaseTag
表示市场摊位,项目1
表示苹果,项目2
表示橙子,则第一种格式非常合适
但是,如果这两个项目是不同的,最好单独分组,那么第二种格式更有意义。如果SomeBaseTag
表示基本粒子,**Item1
**s是费米子,**Item2
**s是玻色子,则会出现这种情况
在您的示例中,两个不同的项共享相同的属性名称,这使得它们之间的关系更为密切更符合逻辑。我同意每个人对“口味问题”的看法,但我想补充一点。毕竟,XML是一种标记语言,因此您可能会想,如果去掉所有标记及其属性,它将剩下什么。正如前面所说,风格和品味是主要因素。还有其他的
属性受其可包含内容的限制。例如,它们不能包含元素。此外,某些字符如“听起来您想创建一些定义,通过这些定义可以衡量XML。如果是这样,我建议您学习XML模式。它是定义XML结构的绝佳工具,甚至可以用来创建完全不同的语言。在这种情况下,它与DOCTYPE类似,只是从模式生成的XML能够自我感知自己的结构定义。如果XML包含的数据是从包含它的元素的层次结构中定义的,那么这一点很重要
就属性而言,一般规则是使用元素来包含数据,而不是属性。用模式定义的元素可以指定数据类型约束以及前面描述的结构质量。使用属性的好处是简洁。属性可以很容易地取代需要嵌套元素2到4才能准确描述的内容。我不同意这是一个“品味问题”。XML元素和属性的语义不同:
- 元素的顺序重要,属性的顺序不重要。
- 允许重复元素,但不允许重复属性。
- 空格在属性中很重要,通常不在元素中。
- 元素可以包含其他元素,属性不能包含属性或元素。
- 忽略未识别的属性,通常传递未识别的元素。
<SomeBaseTag>
<SomeItemTag>
<SomeAttributeTag>one</SomeAttributeTag>
<AnotherAttributeTag>two</AnotherAttributeTag>
</SomeItemTag>
<SomeItemTag>
<SomeAttributeTag>one</SomeAttributeTag>
<AnotherAttributeTag>two</AnotherAttributeTag>
</SomeItemTag>
</SomeBaseTag>
一
二
一
二
标记名是有意义的词,如“person”、“address”或“primeFactor”,而不是无意义的词,如“Item”或“attribute”。我觉得XML模式的设计有一定的品味。但是你提供的两种选择有明显的不同 例1:
<SomeBaseTag>
<Item1/>
<Item1/>
<Item2/>
例2:
<SomeBaseTag>
<Set1>
<Item1/>
<Item1/>
</Set1>
<Set2>
<Item2/>
</Set2>
第一个对我来说就像是一个大容器,其中混合了Item1和Item2实体,以随机或潜在的混合顺序。第二个是包含两个子容器的容器,每个子容器包含一组特定类型的实体
这种差异对你的目的可能并不重要。但在某些情况下,它很重要,尤其是当模式变得更加复杂时。请参见约翰桑德斯(johnsaunders)在WSDL上的示例以获取说明
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,将服务与一组操作关联起来并不容易 虽然XML中的“ML”代表“标记语言”,虽然它最初的意思是这样的,但XML现在很少用于标记文本。对了,John,但正如我所说的,我会将此添加到考虑正反平衡的情况中。嗯?如果将XML文档中的所有标记都去掉,就会留下垃圾。XML不是一种文本标记,不管名称对您意味着什么。XML是关于信息集的。设计一个XML模式,甚至部分基于对没有尖括号和标记的文本外观的一些想法。。。似乎……嗯。。。。非常错误。这取决于数据的性质,奇索。XML应用程序扩展到了InfoSet。您的分歧的基础似乎是无效的。这个问题并不预先假定属性和元素的语义
<wsdl>
<schema/>
<schema/>
<schema/>
<message/>
<message/>
<message/>
<operation/>
<operation/>
<operation/>
<binding/>
<binding/>
<binding/>
<service/>
</wsdl>