XML 验证工具

验证 XML 语法并检查格式错误

加载示例

XML 输入

本地运行 · 粘贴密钥安全无忧

什么是 XML 验证?

XML 验证工具用于检查 XML 文档是否符合 XML 1.0 规范(W3C 推荐标准,第五版)定义的结构规则。最基本的检查是确认文档是否格式良好:包含单一根元素、所有标签正确嵌套并已关闭、属性值加有引号,以及保留字符使用了预定义实体。任何不满足上述条件的文档都会导致 XML 解析器抛出错误,而非静默产生错误的输出。

格式良好性(well-formedness)与有效性(validity)的区别至关重要。格式良好的 XML 文档满足 XML 规范本身的语法规则。有效的 XML 文档则更进一步:还需符合外部 schema 定义的约束,例如 DTD(文档类型定义)、XSD(XML Schema 定义)或 Relax NG schema。本工具检查格式良好性,这是最常见也是最基础的验证步骤。缺少这一步,所有后续处理都无从开始。

XML 验证能在问题进入生产环境前提前捕获错误。未关闭的标签、元素名称不匹配、未转义的 & 符号以及重复属性,是手工编辑 XML 时最常见的错误。不同语言的解析器对这些错误的处理方式各异:有的静默失败,有的返回部分结果,有的抛出异常。先将 XML 通过验证器检查可消除这种不确定性,给出明确的通过或失败结果,并提示错误的具体位置。

为什么使用在线 XML 验证工具?

尽早发现 XML 语法错误可防止下游应用程序出现连锁故障。基于浏览器的验证工具无需安装命令行工具或配置 IDE 插件,即可获得即时反馈。

即时错误检测
粘贴 XML,不到一秒即可获得通过或失败的结果,并显示错误的精确位置。无需等待构建流水线,也无需配置 CLI 工具。
🔒
隐私优先处理
所有解析和验证操作均使用 DOMParser API 在浏览器中完成。您的 XML 不会离开本机,也不会发送到任何服务器。
🎯
精准的错误报告
可以看到验证失败的确切行号和列号,以及对应的错误描述。这比从应用代码中读取解析器的堆栈跟踪要快得多。
📋
无需账号或安装
打开页面,粘贴 XML,即可查看结果。无需注册,无需桌面软件,也无需浏览器扩展。

XML 验证工具使用场景

前端开发
在将 SVG 文件和 XHTML 片段嵌入 React 或 Vue 组件之前先进行验证。SVG 中一个未关闭的标签就可能破坏整个组件树。
后端工程
检查来自第三方 API 的 SOAP 响应、XML-RPC 负载和 RSS/Atom 订阅。在编写反序列化逻辑前先验证原始响应,避免在运行时调试解析器异常。
DevOps 与 CI/CD
在自动化编辑后验证 Maven pom.xml、.csproj 或 Ant 构建文件是否格式良好。构建配置中的语法错误会导致整个流水线失败,并产生难以理解的错误信息。
质量保证与测试
在运行集成测试前验证 XML 测试夹具和预期输出文件。格式错误的夹具会产生假阴性结果,浪费调试时间。
数据工程
检查来自数据库、政府开放数据门户和 ETL 流水线的 XML 导出文件。在编写 XPath 查询或 XSLT 转换前先验证结构,避免在损坏的源数据上浪费精力。
学习 XML
学习 W3C XML 或 XSLT 教程的学员可以将练习文件粘贴到验证工具中检查语法。错误信息会直接指向问题所在,加快学习进度。

XML 格式良好性规则

XML 1.0 规范定义了一套严格的语法规则。文档必须满足所有这些规则才能被视为格式良好。下表列出了每条规则的内容、要求及正确示例。大多数验证错误都源于其中某条规则。

规则要求正确示例
Single root elementDocument must have exactly one root<root>...</root>
Matched tagsEvery opening tag needs a closing tag<p>text</p>
Proper nestingTags must close in reverse order of opening<a><b>...</b></a>
Quoted attributesAttribute values must be in single or double quotes<el attr="val"/>
Entity escapingReserved characters must use predefined entities&lt; &gt; &amp; &quot; &apos;
Case sensitivityTag names are case-sensitive: <A> is not </a><Book>...</Book>
No duplicate attributesEach attribute name must appear once per element<el a="1" b="2"/>
Valid XML declarationIf present, must be the very first line<?xml version="1.0"?>

格式良好 vs DTD 有效 vs Schema 有效

XML 验证分为三个层级。本工具检查第一层(格式良好性),这是另外两层的前提条件。

格式良好
满足 XML 1.0 语法规则:单一根元素、标签匹配、属性加引号、正确嵌套。每个 XML 解析器首先检查这一点。如果文档不是格式良好的,它根本就不是 XML。
DTD 有效
符合文档类型定义(DTD),该定义规定了允许的元素和属性、顺序及基数。DTD 可以内联声明或通过 DOCTYPE 引用。DTD 验证在旧有系统和 XHTML 中较为常见。
Schema 有效(XSD / Relax NG)
符合 XML Schema 定义(XSD)或 Relax NG schema。这些 schema 支持数据类型(整数、日期、URI)、命名空间和复杂内容模型。XSD 验证是 SOAP 网络服务、HL7 医疗数据和企业集成的标准方式。

代码示例

在不同语言中以编程方式验证 XML。每个示例检查格式良好性,若文档格式错误则返回错误信息。

JavaScript (DOMParser)
function validateXML(xmlString) {
  const parser = new DOMParser()
  const doc = parser.parseFromString(xmlString, 'application/xml')
  const error = doc.querySelector('parsererror')
  if (error) {
    return { valid: false, message: error.textContent }
  }
  return { valid: true, message: 'Well-formed XML' }
}

validateXML('<root><item>hello</item></root>')
// → { valid: true, message: "Well-formed XML" }

validateXML('<root><item>hello</root>')
// → { valid: false, message: "Opening and ending tag mismatch..." }
Python
import xml.etree.ElementTree as ET

def validate_xml(xml_string):
    try:
        ET.fromstring(xml_string)
        return True, "Well-formed XML"
    except ET.ParseError as e:
        return False, str(e)

valid, msg = validate_xml('<root><item>hello</item></root>')
# → (True, "Well-formed XML")

valid, msg = validate_xml('<root><item>hello</root>')
# → (False, "mismatched tag: line 1, column 27")

# With lxml — also supports XSD schema validation
from lxml import etree
schema = etree.XMLSchema(etree.parse('schema.xsd'))
doc = etree.fromstring(b'<root><item>hello</item></root>')
schema.validate(doc)  # → True or False
Go
package main

import (
    "encoding/xml"
    "fmt"
    "strings"
)

func validateXML(raw string) error {
    decoder := xml.NewDecoder(strings.NewReader(raw))
    for {
        _, err := decoder.Token()
        if err != nil {
            if err.Error() == "EOF" {
                return nil
            }
            return err
        }
    }
}

func main() {
    err := validateXML("<root><item>hello</item></root>")
    fmt.Println(err) // → <nil>

    err = validateXML("<root><item>hello</root>")
    fmt.Println(err) // → XML syntax error: unexpected end element </root>
}
CLI (xmllint)
# Check well-formedness (part of libxml2, pre-installed on macOS/Linux)
xmllint --noout document.xml
# Exit code 0 = valid, non-zero = errors printed to stderr

# Validate against an XSD schema
xmllint --noout --schema schema.xsd document.xml

# Validate against a DTD
xmllint --noout --dtdvalid schema.dtd document.xml

# Validate from stdin
echo '<root><unclosed>' | xmllint --noout -
# → :1: parser error : Premature end of data in tag unclosed line 1

常见问题

格式良好的 XML 与有效的 XML 有什么区别?
格式良好的 XML 遵循 XML 1.0 规范的语法规则:单一根元素、标签匹配且正确嵌套、属性加引号。有效的 XML 更进一步,还需符合定义了允许元素、属性和数据类型的 DTD 或 XSD schema。一个文档可以格式良好但无效——语法正确但违反了 schema 约束。
XML 文档可以有效但格式不良好吗?
不可以。格式良好性是有效性的前提。如果文档违反了任何 XML 语法规则(未关闭的标签、未加引号的属性等),解析器就无法从中构建树形结构,schema 验证根本无从进行。应先修复格式良好性错误,再检查 schema 合规性。
最常见的 XML 验证错误有哪些?
五种最常见的错误是:未关闭或不匹配的标签、文本内容中未转义的 & 符号、未加引号的属性值、缺少根元素,以及标签名称大小写错误(XML 区分大小写)。这些错误大多由手工编辑 XML 或在代码中使用字符串拼接而非正规 XML 序列化器导致。
XML 验证和 XML linting 是同一回事吗?
两者有重叠,但并不完全相同。验证检查文档是否符合 XML 规范(格式良好性)或 schema(DTD/XSD)。Linting 通常还会进一步标记风格问题:缩进不一致、未使用的命名空间声明或多余的默认属性值。libxml2 的 xmllint 兼具两者:--noout 检查格式良好性,--schema 增加 XSD 验证。
XML 验证与 JSON 验证有何不同?
XML 的语法比 JSON 更严格也更复杂。XML 要求开闭标签匹配,支持属性、命名空间、混合内容(文本与元素并存),并有多种 schema 语言(DTD、XSD、Relax NG、Schematron)。JSON 验证检查花括号/方括号匹配、引号键和逗号位置。JSON Schema 虽然存在,但比 XSD 简单得多。对于相同数据,XML 文档通常比等效 JSON 大 2-3 倍。
本工具支持 XSD 或 DTD schema 验证吗?
本工具仅检查格式良好性:确认您的 XML 是否遵循 XML 1.0 规范的语法规则。不支持外部 DTD 或 XSD schema 验证。如需 schema 验证,请在命令行使用 xmllint --schema,或使用 Python 的 lxml 库(支持 XSD 和 Relax NG)。
为什么我的 XML 看起来正确却验证失败?
最常见的隐性原因有:XML 声明前有字节顺序标记(BOM)、根标签关闭后存在多余字符、文本内容中有未转义的 & 符号(应使用 &amp;),或命名空间前缀已使用但从未声明。可将 XML 放入十六进制查看器,或通过 xmllint --noout 运行以获取错误的精确字节偏移量。