如何在 C++ 中使用 XML 处理

如何在 C++ 中使用 XML 处理

Aspose.Cells FOSS for C++ 包含一个轻量级的 XML 处理层,用于内部读取和写入 Open XML 部分。XmlDocument、XmlElement 和 XmlAttribute 类提供对 XML 数据的编程访问。本指南涵盖加载 XML、遍历元素以及序列化文档。

分步指南

步骤 1:设置构建

cmake_minimum_required(VERSION 3.15)
project(XmlProcessing CXX)
set(CMAKE_CXX_STANDARD 17)

add_subdirectory(path/to/Aspose.Cells-FOSS-for-Cpp)
add_executable(XmlProcessing main.cpp)
target_link_libraries(XmlProcessing PRIVATE Aspose.Cells.Foss.Cpp)

步骤 2:包含头文件

#include "aspose/cells_foss/XmlDocument.h"
#include "aspose/cells_foss/XmlElement.h"
#include "aspose/cells_foss/XmlAttribute.h"

using namespace Aspose::Cells_FOSS;

步骤 3:加载 XML 文档

使用 XmlDocument::Load 将 XML 字符串解析为内存中的文档树:

int main() {
    XmlDocument doc;
    doc.Load("<root><item key=\"a\">Hello</item><item key=\"b\">World</item></root>");
    return 0;
}

步骤 4:检查空元素

XmlElement 使用基于句柄的模型——从缺失路径返回的元素为 null。始终在访问数据之前检查 IsNull():

XmlElement root = doc.GetRootElement();
if (!root.IsNull()) {
    std::string val = root.GetValue();
}

步骤 5:遍历属性

使用 XmlElement::GetAttributes() 检索属性集合。每个属性句柄都公开其名称和值:

auto attrs = root.GetAttributes();
for (auto& attr : attrs) {
    bool isNull = attr.IsNull();
}

步骤 6:序列化为 UTF-8 字符串

使用 XmlDocument::SaveToUtf8() 获取序列化的 XML:

std::string xml = doc.SaveToUtf8();

步骤 7:处理解析错误

在处理不受信任的 XML 时,将 XmlDocument::Load 包裹在 try/catch 块中:

try {
    doc.Load(xmlContent);
} catch (const XmlParsingException& ex) {
    // Handle malformed XML
}

常见问题与解决方案

IsNull() 意外返回 true 文档中不存在该元素路径。请在遍历之前验证 XML 结构是否符合预期模式。

XmlParsingException 加载时 输入格式错误或包含不受支持的实体。请在将其传递给之前,使用外部工具验证 XML。 Load.

SaveToUtf8() 返回意外的输出 文档结构在之后被修改 Load. 验证所有中间 Build 操作已正确完成。

未找到属性 属性查找区分大小写。请确认属性名称与 XML 源中出现的完全一致。

空结果来自 GetValue() 仅包含空白的文本节点可能返回空字符串。检查原始 XML 以确认该元素包含非空白内容。

常见问题解答

XML 层是面向应用使用还是仅供内部使用?

XmlDocument、XmlElement 和 XmlAttribute 类是公共 API 的一部分,可直接使用。映射类(WorkbookXmlMapper、WorksheetXmlMapper 等)是由 XlsxWorkbookSerializer 调用的内部辅助类,不建议直接使用。

我可以从头创建一个新的 XML 文档吗?

可以。使用 XmlDocument::Build 以编程方式构建文档,然后使用 XmlElement 和 XmlAttribute::MakeAttribute 添加节点。

XmlDocument 支持 XPath 查询吗?

不支持。当前实现仅提供元素句柄遍历;不支持 XPath。

SaveToUtf8() 产生什么编码?

输出始终是 UTF-8 编码的 XML。输出中包含 XML 声明(<?xml version="1.0" encoding="UTF-8"?>)。

我可以使用 XmlDocument 来读取 XLSX 存档部件吗?

XLSX 存档部件由 XlsxWorkbookSerializer 在内部管理。没有公开的 API 用于提取原始存档部件。请使用 Workbook 进行所有 XLSX load/save 操作。

另请参阅

 中文