解析HTML或XML文件后,我们可以得到DOM树。
解析C、C++或JavaScript后,我们可以得到语法树。
请注意,语法树是基于上下文无关文法构建的,该文法指定了一个有效的C/C++/JS程序。
但是似乎DOM树只是由HTML/XML文件指定的纯层次结构。这是真的吗?这就是解析后进行模式验证的原因吗?这两种解析树之间的根本区别是什么?
解析HTML或XML文件后,我们可以得到DOM树。
解析C、C++或JavaScript后,我们可以得到语法树。
请注意,语法树是基于上下文无关文法构建的,该文法指定了一个有效的C/C++/JS程序。
但是似乎DOM树只是由HTML/XML文件指定的纯层次结构。这是真的吗?这就是解析后进行模式验证的原因吗?这两种解析树之间的根本区别是什么?
感谢Ira Baxter和Guy Coder的关注。
我进行了一段时间的研究,并比较了这两种情况。我的印象是这样的:
XML的“解析”可以是“验证解析”或“非验证解析”。对于后者,解析器不会根据文档类型定义(DTD)文件检查其语法。该解析器仅生成XML文件中元素的层次结构。因此,它比“验证解析”更轻量级。
C/C++/Java的“解析”基于其无上下文语法生成语法树。因此,非正式地说,它更像“验证解析”。
附言:我不是专家,如果您发现我的理解有误,请随时提出评论。
像其他语言一样,XML也有其语法规则。XML的语法规则相当简单(开始标签、结束标签、正确嵌套)。因此,语法树看起来也很简单(只是元素的层次结构)。XML模式是描述XML文件内容的另一个语法。
基本上,这是两个解析器依次调用。第一个验证所有的开始标签都有对应的结束标签,并且嵌套正确。
第二个解析器验证XML文件的内容是否按照模式(语法)结构化。例如,名为“B”的元素只能包含在名为“A”的元素中。
这与解析编程语言(如C)不同,因为您无法更改编程语言的语法。if语句只能出现在函数体内部,而不能出现在外部,您无法更改它。但是,在XML中,您可以通过指定XML文件内容的语法模式来指定“B”元素只能出现在“A”元素中,或者“A”元素只能出现在“B”元素中。