我知道语法是有效的,但我的问题是它是否在逻辑上有效:
<parent>
<name>John</name>
<child>Mary</child>
<child>Lucy</child>
<child>Hannah</child>
</parent>
或正确的方法是:
<parent>
<name>John</name>
<child>
<name>Mary</name>
</child>
<child>
<name>Lucy</name>
</child>
<child>
<name>Hannah</name>
</child>
</parent>
网上是否有一些文件明确说出了什么是对错?
答案 0 :(得分:15)
我更喜欢后者,因为它清楚地表明它是玛丽的孩子的名字,而不是玛丽的孩子自己。
我认为使用属性会更好,就像这样:
<parent name="John">
<child name="Mary" />
<child name="Lucy" />
<child name="Hannah" />
</parent>
因为它清楚地表明该名称只是父/子实体的一个特征。
答案 1 :(得分:6)
从可扩展性的角度来看,第二个似乎更有意义。如果您需要为第一个孩子添加生日,会发生什么?是的,你可以添加一个XML属性,但迟早会因为添加复杂类型甚至是基本枚举而陷入困境。
此外 - 将子元素分组在一个“子元素”下可能更好:
<parent>
<name>John</name>
<children>
<child>
<name>Mary</name>
<dob>1970-01-01</dob>
</child>
<child>
<name>Lucy</name>
<dob>1971-01-01</dob>
</child>
<child>
<name>Hannah</name>
<dob>1974-01-01</dob>
</child>
<children>
</parent>
还有一件事:你可能不会将这些孩子归为一个单一的父元素,但我已经将其与你的原始元素保持一致。
答案 2 :(得分:5)
这取决于你将如何处理它。如果您将来有可能需要存储关于每个人的更多数据,那么第二个版本会更好。
答案 3 :(得分:2)
第二个是可取的。这清楚地表明name
是孩子的属性,并不识别孩子自己。
从课程方面考虑:
此
class Parent {
string Name;
List<Child> Children;
}
class Child {
string Name;
}
优于
class Parent {
string Name;
List<string> Children;
}
第二个选项还为您提供了将来扩展的灵活性(例如,添加生日元素)。
更主观的争论是,是否对name
等属性使用元素或属性。
最后,添加一个children
元素,其中包含child
个元素。
答案 4 :(得分:2)
当然,这个问题没有正确的答案,但如果孩子比单个文本字符串更复杂(或者可能变得更复杂),那么第二个选项更可取。
就您通常看到的情况而言,通常在任何一种情况下,所有子元素都将分组在子元素下。在某些可视化环境中,它可以帮助关闭所有孩子,而其他元素保持焦点。
答案 5 :(得分:2)
我会使用Shoko和DanDan或Wim Hollebrandse之间的替代方案:
<parent name="John">
<children>
<child name="Mary" />
<child name="Lucy" />
<child name="Hannah" />
</children>
</parent>
因为我喜欢孩子的“集合”,实际上是孩子。
答案 6 :(得分:1)
是XML,没有对错。你的答案都是正确的,但这同样有效:
<parent>
<name>John</name>
<children>
<child>Mary</child>
<child>Lucy</child>
<child>Hannah</child>
</children>
</parent>
您应该选择哪种方式?这取决于任务。我不认为提出的任何方式都是最灵活的(如果孩子有孩子会怎么样?)
答案 7 :(得分:1)
两者都是对的。关于如何构建元素没有定义 - 这完全取决于你!
有些人试图减少节点数量。那些人可能会创建像
这样的xml<parent name="John">
<child name="Mary" />
<child name="Lucy" />
<child name="Hannah" />
</parent>
但是关于XML的线索是,你应该总是尽可能轻松地阅读和理解人类。拧动这些comupters,他们将永远了解你的XML,所以让它变得人性化!
答案 8 :(得分:1)
没有关于如何将数据映射到XML Schema的标准。有一些常见的做法,其中一种是使用striped XML,所以嵌套元素交替采用类型/关系/类型/关系角色:
<!-- striped style, RDF etc -->
<person>
<name>John</name>
<children>
<person>
<name>Mary</name>
</person>
<person>
<name>Lucy</name>
</person>
<person>
<name>Hannah</name>
</person>
<children>
</parent>
这是非常规律的,但有点冗长。
将人类可读文本放入属性以节省空间通常是个坏主意:
<person name="fred"/>
因为这排除了使用某些形式的国际化所必需的ruby mark up,以及使用CSS渲染更复杂。如果您只关心压缩表示和ASCII文本,那么XML可能不是最适合使用的格式。
答案 9 :(得分:1)
值得一提的是,“有效”一词在XML中具有特定含义。
当且仅当XML文档符合其DTD或模式时,XML文档才有效。基本上,文本字符串的范围分为两类:格式良好的XML和非格式的XML。格式良好的XML文档也分为三类:有效的XML文档(符合其DTD /模式),无效的XML文档(没有),以及那些有效性无法确定的文档(因为它们不是'有一个DTD /架构。)
就您的实际问题而言,您只能根据XML文档的使用目的来判断XML文档的设计。你打算用XSLT改造吗?用XPath查询它?使用Linq-to-XML处理它?用SAX读卡器处理它?将其中的数据反序列化为对象?在记事本中编辑它?根据模式验证它?通过慢速网络传输?所有这些事情(还有更多)都应该影响XML的设计。没有一个正确的答案。