XML转YAML需先用Jackson XmlMapper解析为Map再用SnakeYAML序列化,因SnakeYAML不支持XML解析;注意namespace和CDATA会丢失,复杂场景应手动解析或用JAXB。

XML 转 YAML 不能直接用 SnakeYAML
SnapYAML 本身不支持 XML 解析,它只处理 YAML 的读写。想把 XML 配置转成 YAML,得先解析 XML 成 Java 对象(或 Map),再用 SnakeYAML 序列化输出。硬套 Yaml.load() 或 Yaml.dump() 到 XML 字符串上,会直接抛 org.yaml.snakeyaml.parser.ParserException 或空指针。
推荐路径:XML → Jackson XmlMapper → Map → SnakeYAML
Jackson 的 XmlMapper 能把 XML 安全转成嵌套 Map 或 JsonNode,结构清晰、属性/文本/命名空间处理靠谱,比手写 DOM/SAX 简单得多。再喂给 SnakeYAML 输出,可控性高。
实操建议:
- 加依赖:
com.fasterxml.jackson.dataformat:jackson-dataformat-xml和org.yaml:snakeyaml - 用
XmlMapper时设configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)避免 XML 多了字段就崩 - 转
Map后,传给Yaml.dump()前可手动删掉顶层 key(比如 XML 根节点名),否则 YAML 会多一层缩进 - 若 XML 有属性(如
<host port="8080">localhost</host>),XmlMapper默认把属性转成@port这样的 key,SnakeYAML 会原样输出,无需额外处理
注意 namespace 和 CDATA 会丢数据
XmlMapper 默认忽略 namespace 前缀和 CDATA 内容——前者变成普通字段名(ns:port → port),后者被当成纯文本但可能触发转义。这不是 bug,是设计取舍。
立即学习“Java免费学习笔记(深入)”;
如果 XML 配置强依赖 namespace(如 Spring XSD 场景)或含 HTML 片段类 CDATA,别走 Map 中转路:
- 改用
DocumentBuilder手动遍历节点,把getAttributes()、getTextContent()、getChildNodes()映射到自定义 POJO - 或者用
jaxb2-maven-plugin生成类,再用 SnakeYAML dump,但要确保 JAXB 注解和 YAML 序列化兼容(比如@XmlTransient字段不会出 YAML)
输出 YAML 时缩进和换行容易失控
SnakeYAML 默认用 2 空格缩进、无尾部换行,但 XML 转来的 Map 嵌套深时,YAML 可能一行超长或空行过多。这不是格式错误,但人眼难读。
调优方法:
- 构造
Yaml实例时传new DumperOptions(),设setWidth(120)和setIndent(2) - 避免用
dumpAsMap(),改用dump()+ 自定义Representer控制 Map/List 的序列化行为 - 如果原始 XML 是扁平配置(如 Spring Boot
application.xml),建议先 flatten 成键值对(host.port: 8080),再 dump,比嵌套结构更贴近运维习惯
真正麻烦的从来不是“能不能转”,而是 XML 里那些隐式规则——默认值、条件包含、注释语义——YAML 本身不表达这些,转完就得人工核对逻辑等价性。










