xml.etree.ElementTree 是解析无统一 schema XML 最稳方案,兼容性好、内存低、无需额外安装;常见错误如 ParseError 多因 BOM、编码声明不匹配或未转义字符。

用 Python 的 xml.etree.ElementTree 解析结构最稳
XML 没有统一 schema,直接正则替换或字符串切割必然翻车。ElementTree 是 Python 标准库中对常见 XML 结构兼容性最好、内存占用低、且无需额外安装的方案。xml.etree.ElementTree 能把嵌套标签转成树状对象,后续按需提取文本、属性、层级关系,再拼成 Markdown 行为可控。
常见错误现象:xml.etree.ElementTree.ParseError: not well-formed——多半是 XML 带 BOM、编码声明不匹配(如文件是 UTF-8 但声明为 ISO-8859-1),或含未转义的 &、 字符。
- 读取时显式指定 encoding,比如
open(path, "r", encoding="utf-8"),别依赖默认 - 遇到含 CDATA 或混合内容(text + child)的节点,别只调
elem.text,要结合elem.itertext()合并所有文本片段 - 若 XML 有命名空间(如
xmlns="http://example.com/ns"),必须在查找时传入命名空间字典,否则find("item")返回None
标题/段落/列表的 Markdown 映射要按语义走
不能简单把 <h2></h2> 替成 ## 就完事。真实 XML 中,<section></section>、<chapter></chapter>、<title></title> 都可能对应标题;<p></p><div class="aritcle_card flexRow">
<div class="artcardd flexRow">
<a class="aritcle_card_img" href="/xiazai/shouce/1727" title="Android数据格式解析对象JSON用法 WORD版"><img
src="https://img.php.cn/upload/manual/000/000/011/170658575739710.png" alt="Android数据格式解析对象JSON用法 WORD版" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a href="/xiazai/shouce/1727" title="Android数据格式解析对象JSON用法 WORD版">Android数据格式解析对象JSON用法 WORD版</a>
<p>本文档主要讲述的是Android数据格式解析对象JSON用法;JSON可以将Java对象转成json格式的字符串,可以将json字符串转换成Java。比XML更轻量级,Json使用起来比较轻便和简单。JSON数据格式,在Android中被广泛运用于客户端和服务器通信,在网络数据传输与解析时非常方便。希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看</p>
</div>
<a href="/xiazai/shouce/1727" title="Android数据格式解析对象JSON用法 WORD版" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a>
</div>
</div> 不一定只是段落,也可能是说明文字或注释;<ul>/</ul>
<ol></ol> 下的 <li> 才该转成 - 或 1. 。
使用场景:技术文档(如 DocBook)、API 响应体、自定义 CMS 导出数据。这类 XML 的标签名往往不是 HTML 那套,得先看结构再映射。
- 用
elem.tag判断节点类型,而不是硬编码匹配"h1"这类 HTML 标签名 - 层级深度影响 Markdown 标题级别:根下第一级
<chapter></chapter>→#,子<section></section>→##,避免越深越乱 - 空行控制很关键:相邻
<p></p>之间加一个空行,但<p></p>和紧随其后的<ul></ul>之间不加,否则 Markdown 渲染会断开列表
表格和代码块必须保留原始结构特征
XML 中表格常以 <table><tr><td> 形式存在,Markdown 表格语法要求表头分隔线(<code>|---|)和严格对齐,直接拼容易错位;<code> 或 <pre class="brush:php;toolbar:false;"><code></code> 内容若含缩进或特殊字符,用四个空格缩进或围栏式 <code>```</code> 处理更可靠。</p><p>性能影响:遍历表格行生成 Markdown 行时,如果列数不一致(某行少一个 <code><td></code>),会导致渲染错乱甚至报错。不能假设 XML 是“干净”的。</p><ul><li>表格转换前先统计每行 <code><td></code> 或 <code><th></code> 数量,取最大值补空单元格,再生成分隔线</li><li><code><code>hello & world</code></code> 中的 <code>&</code> 必须保留原样,不要被 HTML 解码成 <code>&</code>,否则 Markdown 解析器可能误判</li><li>代码块优先用围栏式:<pre class="brush:php;toolbar:false;">
...</pre>,比缩进式更鲁棒,尤其当内容含首行空格时<h3>特殊字符和实体必须提前处理</h3>
<p>XML 实体如 <code>、<code>"、 在转 Markdown 前就得还原成对应字符(、<code>"、 ),否则会被当成纯文本显示,破坏格式。但注意:仅处理标准实体,别碰自定义 DTD 声明里的实体,那不属于通用解析范围。
容易踩的坑:用 html.unescape() 处理整个 XML 文本——它会把标签也“解”掉,比如 <b></b> 变成 <b></b>,导致后续 ElementTree 解析失败。
- 只对
elem.text和elem.tail调用html.unescape(),跳过标签名和属性值 - 若 XML 含
'(Unicode 十六进制)或(十进制),<code>html.unescape()默认支持,不用额外写逻辑 - Markdown 中星号、下划线、方括号本身有语法意义,如果原文就有,且你希望它们作为字面量出现,得在转换后做一次转义(如
*→\*),但这属于 Markdown 渲染层问题,不在 XML 解析阶段处理
真正麻烦的是那些没命名空间、没 DTD、字段含义靠文档约定的 XML——这时候连“哪个 tag 对应标题”都要人工确认一遍,自动化只能做到结构搬运,语义对齐没法绕开人工校验。









