XML DOM 加载函数大全(2025 年最新、最全、最实用)
下面按语言给出最常用、最稳妥、最推荐的“加载 XML”函数,直接复制粘贴就能用,包含错误处理、防坑技巧。
1. JavaScript(浏览器 + Node.js 通用)
/**
* 加载 XML 字符串或文件 → 返回 DOM Document 对象
* 支持自动错误检测(最推荐写法)
*/
async function loadXML(source) {
const parser = new DOMParser();
let xmlDoc;
if (typeof source === "string") {
// 情况1:直接是 XML 字符串
if (source.trim().startsWith("<")) {
xmlDoc = parser.parseFromString(source, "text/xml");
}
// 情况2:是 URL
else {
const resp = await fetch(source);
if (!resp.ok) throw new Error(`HTTP ${resp.status} ${resp.statusText}`);
const text = await resp.text();
xmlDoc = parser.parseFromString(text, "text/xml");
}
} else if (source instanceof File) {
// 情况3:用户上传的 File 对象(如 <input type="file">)
const text = await source.text();
xmlDoc = parser.parseFromString(text, "text/xml");
}
// 关键:检查解析是否出错(所有浏览器都支持)
const errorNode = xmlDoc.querySelector("parsererror");
if (errorNode) {
throw new Error("XML 解析失败:" + (errorNode.textContent || errorNode.querySelector("div")?.textContent));
}
return xmlDoc;
}
// 使用示例
// 1. 加载字符串
loadXML(`<book><title>三体</title></book>`).then(doc => console.log(doc));
// 2. 加载网络文件
loadXML("books.xml").then(doc => console.log(doc.documentElement));
// 3. 加载用户上传的文件
inputElement.onchange = e => loadXML(e.target.files[0]).then(doc => console.log(doc));
2. Python(推荐 lxml,最快最强)
from lxml import etree
import requests
def load_xml(source):
"""
source 可以是:
- str/bytes:XML 字符串
- 文件路径 str
- URL str
- file-like object
"""
parser = etree.XMLParser(remove_blank_text=True) # 自动去掉无意义空白
if isinstance(source, (str, bytes)):
if source.startswith(('http://', 'https://')): # 是 URL
r = requests.get(source)
r.raise_for_status()
return etree.fromstring(r.content, parser)
elif '\n' in source or '<' in source: # 看起来是字符串内容
return etree.fromstring(source.encode() if isinstance(source, str) else source, parser)
else: # 当作文件路径
return etree.parse(source, parser).getroot()
# file-like object
return etree.parse(source, parser).getroot()
# 使用
doc = load_xml("books.xml")
doc = load_xml("<book><title>三体</title></book>")
doc = load_xml("https://example.com/data.xml")
3. Java(最标准、最安全写法)
public static Document loadXML(String source) throws Exception {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// 防止 XXE 攻击(必须加!)
factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
factory.setFeature("http://xml.org/sax/features/external-general-entities", false);
factory.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
factory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
DocumentBuilder builder = factory.newDocumentBuilder();
// 可选:自定义错误处理
builder.setErrorHandler(new ErrorHandler() {
@Override public void warning(SAXParseException e) { System.err.println("Warning: " + e); }
@Override public void error(SAXParseException e) throws SAXException { throw e; }
@Override public void fatalError(SAXParseException e) throws SAXException { throw e; }
});
if (source.trim().startsWith("<")) {
return builder.parse(new InputSource(new StringReader(source)));
} else {
return builder.parse(new File(source));
}
}
4. C# / .NET(最简洁)
public static XmlDocument LoadXML(string source)
{
var doc = new XmlDocument();
// 防止 XXE 攻击
var settings = new XmlReaderSettings {
DtdProcessing = DtdProcessing.Prohibit
};
using var reader = source.StartsWith("<")
? XmlReader.Create(new StringReader(source), settings)
: XmlReader.Create(source, settings);
doc.Load(reader); // 非法 XML 会直接抛异常
return doc;
}
5. PHP(最常用写法)
function loadXML($source) {
$doc = new DOMDocument();
$doc->preserveWhitespace = false; // 去掉无意义空白
$doc->formatOutput = true;
// 防止 XXE
libxml_disable_entity_loader(true);
if (filter_var($source, FILTER_VALIDATE_URL)) {
// 是 URL
$content = file_get_contents($source);
if ($content === false) throw new Exception("无法下载 XML");
$doc->loadXML($content);
} elseif (strpos($source, '<') === 0) {
// 是字符串
$doc->loadXML($source);
} else {
// 是文件路径
$doc->load($source);
}
// 检查错误
$errors = libxml_get_errors();
if (!empty($errors)) {
throw new Exception("XML 解析错误:" . print_r($errors, true));
}
libxml_clear_errors();
return $doc;
}
终极推荐(一句话记牢)
| 语言 | 一行加载神器(推荐) |
|---|---|
| JavaScript | new DOMParser().parseFromString(str, "text/xml") |
| Python | etree.XML(xml_str) 或 etree.parse(file).getroot() |
| Java | DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(...) |
| C# | new XmlDocument().LoadXml(str) |
| PHP | new DOMDocument()->loadXML($str) |
把上面对应语言的函数保存成工具类,以后所有项目直接调用,再也不用每次现写加载代码了!
需要我给你打包成一个多语言的 “xml-loader.js/py/java/cs/php” 工具包,直接说一声~