Jak pracować z przetwarzaniem XML w C++
Aspose.Cells FOSS dla C++ zawiera lekką warstwę przetwarzania XML używaną wewnętrznie do odczytu i zapisu części Open XML. Klasy XmlDocument, XmlElement i XmlAttribute zapewniają programowy dostęp do danych XML. Ten przewodnik opisuje ładowanie XML, przeglądanie elementów i serializację dokumentów.
Przewodnik krok po kroku
Krok 1: Skonfiguruj kompilację
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)Krok 2: Dołącz nagłówki
#include "aspose/cells_foss/XmlDocument.h"
#include "aspose/cells_foss/XmlElement.h"
#include "aspose/cells_foss/XmlAttribute.h"
using namespace Aspose::Cells_FOSS;Krok 3: Załaduj dokument XML
Użyj XmlDocument::Load do parsowania ciągu XML w drzewo dokumentu w pamięci:
int main() {
XmlDocument doc;
doc.Load("<root><item key=\"a\">Hello</item><item key=\"b\">World</item></root>");
return 0;
}Krok 4: Sprawdź elementy null
XmlElement używa modelu opartego na uchwytach — element zwrócony z nieistniejącej ścieżki ma wartość null. Zawsze sprawdzaj IsNull() przed dostępem do danych:
XmlElement root = doc.GetRootElement();
if (!root.IsNull()) {
std::string val = root.GetValue();
}Krok 5: Przeglądaj atrybuty
Użyj XmlElement::GetAttributes(), aby pobrać kolekcję atrybutów. Każdy uchwyt atrybutu udostępnia swoją nazwę i wartość:
auto attrs = root.GetAttributes();
for (auto& attr : attrs) {
bool isNull = attr.IsNull();
}Krok 6: Serializuj do UTF-8 String
Użyj XmlDocument::SaveToUtf8(), aby uzyskać zserializowany XML:
std::string xml = doc.SaveToUtf8();Krok 7: Obsłuż błędy parsowania
Umieść XmlDocument::Load w bloku try/catch podczas przetwarzania nieufnych XML:
try {
doc.Load(xmlContent);
} catch (const XmlParsingException& ex) {
// Handle malformed XML
}Typowe problemy i rozwiązania
IsNull() zwraca true nieoczekiwanie Ścieżka elementu nie istnieje w dokumencie. Zweryfikuj, czy struktura XML odpowiada oczekiwanemu schematowi przed przeglądaniem.
XmlParsingException przy ładowaniu Dane wejściowe są zniekształcone lub zawierają nieobsługiwane encje. Zweryfikuj XML przy pomocy zewnętrznego narzędzia przed przekazaniem go do Load.
SaveToUtf8() zwraca nieoczekiwany wynik Struktura dokumentu została zmodyfikowana po Load. Zweryfikuj wszystkie pośrednie Build operacje zakończyły się poprawnie.
Nie znaleziono atrybutów Wyszukiwanie atrybutu jest rozróżniające wielkość liter. Sprawdź, czy nazwa atrybutu dokładnie odpowiada temu, jak występuje w źródle XML.
Pusty wynik z GetValue() Węzły tekstowe zawierające tylko białe znaki mogą zwracać pusty ciąg. Sprawdź surowe XML, aby potwierdzić, że element zawiera treść niebędącą białymi znakami.
Najczęściej zadawane pytania
Czy warstwa XML jest przeznaczona do użytku aplikacji, czy tylko do użytku wewnętrznego?
Klasy XmlDocument, XmlElement i XmlAttribute są częścią publicznego API i mogą być używane bezpośrednio. Klasy mapujące (WorkbookXmlMapper, WorksheetXmlMapper itp.) są wewnętrznymi pomocnikami wywoływanymi przez XlsxWorkbookSerializer i nie są przeznaczone do bezpośredniego użycia.
Czy mogę stworzyć nowy dokument XML od podstaw?
Tak. Użyj XmlDocument::Build do programowego tworzenia dokumentu, a następnie użyj XmlElement i XmlAttribute::MakeAttribute do dodawania węzłów.
Czy XmlDocument obsługuje zapytania XPath?
Nie. Obecna implementacja umożliwia jedynie traversowanie uchwytów elementów; XPath nie jest obsługiwany.
Jakie kodowanie generuje SaveToUtf8()?
Wyjście jest zawsze kodowane jako UTF-8 XML. Deklaracja XML (<?xml version="1.0" encoding="UTF-8"?>) jest zawarta w wyjściu.
Czy mogę używać XmlDocument do odczytu części archiwum XLSX?
Części archiwum XLSX są zarządzane wewnętrznie przez XlsxWorkbookSerializer. Nie istnieje publiczny API do wyodrębniania surowych części archiwum. Użyj Workbook do wszystkich operacji ładowania/zapisywania XLSX.