Как работать с XML Processing в C++
Aspose.Cells FOSS для 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: Проверка на null-элементы
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: Обработка ошибок разбора
Оборачивайте XmlDocument::Load в блок try/catch при обработке недоверенных XML:
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.