5月28日 03:47

XML 文档格式良好和有效有什么区别?

格式良好是 XML 的语法底线——标签必须闭合、正确嵌套、单一根元素、属性值加引号、特殊字符转义。解析器碰到不格式良好的文档直接报错,根本不会继续处理。

有效是在格式良好的基础上,再对照 DTD 或 XML Schema 检查语义约束——元素顺序对不对、必填字段有没有缺、数据类型匹不匹配。一个文档可以格式良好但无效(语法没问题但违反了 Schema 约束),但有效的一定格式良好。

核心区别:格式良好只管"能不能解析",有效还要管"符不符合业务规则"。前者是 XML 规范的硬性要求,后者取决于你定义的 Schema。

追问

DTD 和 XML Schema 有什么区别?

维度DTDXML Schema
数据类型只有文本,没有类型支持 string、integer、date 等丰富类型
命名空间不支持原生支持
语法自有一套非 XML 语法本身就是 XML 文档
扩展性支持复杂类型继承、约束facet
现状遗留系统在用,新项目不推荐主流方案

实际项目里怎么选验证方式?

配置文件(Spring、Maven)通常自带 Schema 声明,解析时自动验证。数据交换场景建议用 XSD 做强校验,防止对方传过来的结构不符合约定。开发阶段开验证、生产环境看性能需求可以关掉——Schema 验证有开销。

格式良好但无效的文档能被解析吗?

能。解析器分两类:非验证型解析器只检查格式良好性,不会因为违反 Schema 就拒绝解析。只有开启验证模式的解析器才会同时检查有效性。所以一个缺了必填字段的 XML,照样能被 DOM/SAX 解析成树结构,只是语义上不合规。

什么时候 XML 不格式良好也不会报错?

用了容错解析器(比如浏览器的 HTML 解析器),或者解析时开了 recover 模式。但标准 XML 解析器遇到格式错误必须报告 fatal error,这是 XML 规范的硬要求——和 HTML 的"宽容解析"不同,XML 的设计哲学就是宁可报错也不要猜。

写段代码

java
// 开启 Schema 验证 SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); Schema schema = sf.newSchema(new File("book.xsd")); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setSchema(schema); // 设置 Schema 后解析时自动验证
标签:XML