XML DOM 加载函数

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;
}

终极推荐(一句话记牢)

语言一行加载神器(推荐)
JavaScriptnew DOMParser().parseFromString(str, "text/xml")
Pythonetree.XML(xml_str)etree.parse(file).getroot()
JavaDocumentBuilderFactory.newInstance().newDocumentBuilder().parse(...)
C#new XmlDocument().LoadXml(str)
PHPnew DOMDocument()->loadXML($str)

把上面对应语言的函数保存成工具类,以后所有项目直接调用,再也不用每次现写加载代码了!

需要我给你打包成一个多语言的 “xml-loader.js/py/java/cs/php” 工具包,直接说一声~

文章已创建 2732

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部