不能(明智地)用 XML 表示的数据结构的示例是什么?这是一个面试问题,我找不到任何东西。
8 回答
代表无限系列元素的结构。例如,在 scala 中,我可以按如下方式创建斐波那契数列:
lazy val fibs: Stream[Int]
= 0 #:: 1 #:: ((fibs zip fibs.tail) map { case (n, s) => n + s })
有人会如何用 XML 表示这种结构?我想你可能会争辩说这行得通:-)
<structure lang="scala">
<[[CDATA [
lazy val fibs: Stream[Int]
= 0 #:: 1 #:: ((fibs zip fibs.tail) map { case (n, s) => n + s })
]>
</structure>
如果这是一个面试问题,那么我谦虚地建议,也许你可能根本不想要这份工作......
我认为我们不能“明智地”用 XML 表示 HashTable 数据结构。因为 HashTable 的基本原理说我们必须在 O(1) 时间内获取数据,并且我们通过对每个对象进行索引来实现数组中的数据。但是在 XML 中这是不可能的,我们必须每次都遍历 xml 来获取对象。
每个数据结构都可以用 xml 来表达。
每个数据都可以表示为 0 和 1,或“字节”。您可以将每个数据编码为可打印的形式,例如使用 base64 编码,然后您只需编写
<data>your_base64_data</data>
你有XML!:D
几乎任何东西都可以用 XML 表示。我认为你会在以下情况下避免它:
编码/解析 XML 对于您的目的来说太慢(例如在视频游戏中)或消耗太多内存(例如在手机应用程序中)。
而且,您不需要您自己的应用程序之外的任何内容都可以读取该格式。
PS:提问中的“明智”是什么意思?
[...] 一种无法(明智地)用 XML 表达的数据结构。
如果您手动编写 XML,那么低信噪比(即过多的尖括号、经常重复的元素名称)很可能是您判断 XML“不合理”的一个理由。
我的回答没有考虑这些问题。我相信XML 作为一种由机器而非人类编写和读取的数据交换格式更有用,从这个角度来看,“明智”意味着其他东西(因为您不再进行重复键入或解密,以及 XML 序列化软件也不会抱怨):
“从概念上将数据结构映射到合适的 XML 模式有多难?”
我想这取决于使用的具体 XML 模式。
XML 本身就是一种非常通用的格式。与其说是 XML 格式,不如说是限制了它可以表达的内容。与自然语言相比,XML 本身更类似于大写和标点符号(“正字法”),而不是语法。“语法”或有效内容的结构将更准确地放置在 XML 模式 (XSD) 中。在这方面,它与大多数编程语言不同,它们通常具有一种固定的语法。
让我们暂时离题并做一个类比。让我们假设爱斯基摩语中的雪词比英语多。这是否意味着英语无法准确描述各种形式的雪?不,这仅意味着您可能需要一整句话来转移相同的含义,而不是一个精确的单词。换句话说,英语足够灵活,可以进行限制。
回到 XML:如果您需要一个 XML 模式来描述雪,并且它缺少一个frobble
准确表示“17 天后像通常一样冻结的雪”的元素,那么也许您可以将必要的元素引入允许您表达该描述的模式。
在另一种编程语言中,如果您发现您的类型系统不足以描述某些数据结构,您作为语言设计师会怎么做?您可以简单地扩展类型系统。(例如,泛型从一开始就在 Java 和 C# 中不可用。也可以将 C 样式引入union
C#。)同样的事情可以在 XML 中完成,只是在这里你不必扩展XML 规范,也不是 XML Schema 规范,而是使用中的具体 XML 模式。
最后,我的主要观点是:XML 作为一种格式不限制内容,只限制内容的表示形式(“正字法”)。另一方面,具体的 XML 模式定义什么是有效内容,什么不是(语法)。你可以想出一个任意简单或复杂的语法来满足你的需要。
因此,我确信可以用 XML 描述任何数据结构。
您可以在 XML 中表示任何数据结构,就像您可以在位序列中表示任何数据结构一样。这完全是表示是否方便的问题。例如,XML 对于表示一般图形并不是特别理想,但它当然可以做到。