Jeśli pracowałeś z legacy API korporacyjnymi, korzystałeś z kanałów RSS, otwierałeś plik .docx lub rysowałeś SVG — używałeś XML, nawet jeśli o tym nie wiedziałeś. XML zasila więcej oprogramowania, niż większość programistów zdaje sobie sprawę. Jest starszy niż JSON, bardziej rozbudowany i złożony — ale też bardziej możliwy w określonych kontekstach. To praktyczny przewodnik po tym, czym XML naprawdę jest, jak działa i kiedy nadal ma sens jego stosowanie.

XML to skrót od eXtensible Markup Language (Rozszerzalny Język Znaczników). W3C opublikowało specyfikację XML 1.0 w 1998 roku i stał się on dominującym formatem wymiany danych we wczesnej erze internetu. Słowo „rozszerzalny" jest kluczowe: w przeciwieństwie do HTML, który ma stały zestaw znaczników, XML pozwala definiować własne znaczniki do opisywania dowolnej struktury danych.

Jak wygląda XML

Oto kompletny dokument XML reprezentujący produkt z API e-commerce. Obejmuje wszystkie podstawowe funkcje składni, z którymi się spotkasz:

xml
<?xml version="1.0" encoding="UTF-8"?>
<product id="SKU-8821" inStock="true">
  <name>Wireless Noise-Cancelling Headphones</name>
  <brand>SoundCore</brand>
  <price currency="USD">149.99</price>
  <categories>
    <category>Electronics</category>
    <category>Audio</category>
    <category>Accessories</category>
  </categories>
  <specs>
    <spec name="battery">30 hours</spec>
    <spec name="connectivity">Bluetooth 5.2</spec>
    <spec name="weight">250g</spec>
  </specs>
  <description>
    Premium wireless headphones with active noise cancellation,
    30-hour battery life, and foldable design.
  </description>
</product>

Przeanalizujmy kluczowe elementy. Pierwsza linia to deklaracja XML — informuje parsery, że mamy do czynienia z XML 1.0 zakodowanym w UTF-8. Znacznik <product> to element główny (każdy dokument XML ma dokładnie jeden). Części id i inStock w tym samym znaczniku to atrybuty. Wszystko między otwierającym a zamykającym znacznikiem to elementy potomne, atrybuty lub zawartość tekstowa.

Elementy vs atrybuty — prawdziwa decyzja projektowa

Jedna rzecz, która dezorientuje nowych autorów XML: tę samą daną można przedstawić jako element lub jako atrybut. Oba te zapisy są poprawnym XML-em dla tych samych danych:

xml
<!-- Jako atrybut -->
<price currency="USD">149.99</price>

<!-- Jako element potomny -->
<price>
  <amount>149.99</amount>
  <currency>USD</currency>
</price>

Konwencjonalna mądrość mówi: używaj atrybutów do metadanych o elemencie (identyfikatory, flagi, jednostki), a elementów potomnych do właściwej treści danych — szczególnie jeśli ta treść może stać się złożona, powtarzalna lub sama potrzebować atrybutów w przyszłości. Atrybuty mogą przechowywać tylko zwykły tekst; elementy potomne mogą zawierać dowolną strukturę XML.

Poprawność składniowa vs poprawność schematu — dwa różne standardy

XML ma dwa poziomy poprawności, które często są mylone:

  • Dobrze uformowany XML przestrzega podstawowych reguł składni: jeden element główny, wszystkie znaczniki poprawnie zamknięte, atrybuty w cudzysłowach, brak niedozwolonych znaków. Każdy parser XML może to sprawdzić.
  • Poprawny XML jest zgodny z określonym schematem — DTD (Document Type Definition) lub XML Schema (XSD). Walidacja wymaga zarówno dokumentu, jak i schematu. Można mieć dobrze uformowany XML, który nie jest poprawny względem konkretnego schematu.
W praktyce: większość korporacyjnych integracji XML wymaga poprawności schematu, a nie tylko poprawności składniowej. Jeśli budujesz integrację SOAP lub wymieniasz rekordy medyczne HL7, schemat definiuje dokładnie, jakie elementy są wymagane, jakie typy przechowują i jakie wartości są dozwolone. Użyj XML Validator, aby szybko sprawdzić poprawność składniową.

Miejsca, w których XML pojawia się w praktyce

  • Usługi sieciowe SOAP. Starsza połowa oprogramowania korporacyjnego nadal działa na SOAP — bankowe API, systemy ERP, bramki płatności. Każda wiadomość SOAP to dobrze zdefiniowany dokument XML z kopertą (Envelope), nagłówkiem (Header) i treścią (Body).
  • Kanały RSS i Atom. Każdy feed podcastowy, feed strony z wiadomościami i subskrypcja kanału YouTube to dokument XML. RSS 2.0 i Atom to oba formaty oparte na XML, istniejące od początku XXI wieku.
  • Obrazy SVG. Skalowalna Grafika Wektorowa to XML. Gdy otwierasz plik .svg w edytorze tekstu, czytasz XML. Dlatego możesz stylować SVG za pomocą CSS i manipulować nimi za pomocą JavaScript.
  • Dokumenty Office. Plik .docx, .xlsx lub .pptx to archiwum ZIP zawierające pliki XML. Office Open XML to sposób, w jaki Microsoft przechowuje wszystkie nowoczesne formaty dokumentów Office.
  • Layouty Android. Layouty UI w Androidzie są definiowane w plikach XML. Jeśli zajmowałeś się programowaniem na Android, napisałeś sporo XML.
  • Maven i pom.xml. System budowania Maven dla Javy używa pliku pom.xml do definiowania zależności projektu i konfiguracji budowania — znany każdemu programiście Java.

Parsowanie XML w JavaScript — DOMParser

W przeglądarce możesz parsować łańcuchy XML za pomocą wbudowanego API DOMParser. Działa tak samo jak parsowanie HTML:

js
const xmlString = `<?xml version="1.0"?>
<product id="SKU-8821">
  <name>Wireless Headphones</name>
  <price currency="USD">149.99</price>
  <categories>
    <category>Electronics</category>
    <category>Audio</category>
  </categories>
</product>`;

const parser = new DOMParser();
const doc = parser.parseFromString(xmlString, 'application/xml');

// Sprawdź błędy parsowania
const parseError = doc.querySelector('parsererror');
if (parseError) {
  console.error('XML parse error:', parseError.textContent);
} else {
  const name = doc.querySelector('name').textContent;
  const currency = doc.querySelector('price').getAttribute('currency');
  const categories = [...doc.querySelectorAll('category')].map(el => el.textContent);

  console.log(name);       // Wireless Headphones
  console.log(currency);   // USD
  console.log(categories); // ['Electronics', 'Audio']
}

Parsowanie XML w Pythonie — ElementTree

Biblioteka standardowa Pythona zawiera xml.etree.ElementTree — bez potrzeby instalowania dodatkowych pakietów do podstawowego parsowania XML:

python
import xml.etree.ElementTree as ET

xml_string = """<?xml version="1.0"?>
<product id="SKU-8821">
  <name>Wireless Headphones</name>
  <price currency="USD">149.99</price>
  <categories>
    <category>Electronics</category>
    <category>Audio</category>
  </categories>
</product>"""

root = ET.fromstring(xml_string)

name = root.find('name').text
currency = root.find('price').get('currency')
categories = [el.text for el in root.findall('categories/category')]

print(name)        # Wireless Headphones
print(currency)    # USD
print(categories)  # ['Electronics', 'Audio']

Pułapki, które czyhają na autorów XML

  • Kodowanie encji. Pięć znaków musi być zakodowanych w tekście XML i wartościach atrybutów: &&amp;, <&lt;, >&gt;, "&quot;, '&apos;. Zapomnienie o zakodowaniu ampersanda w URL niszczy cały dokument.
  • Przestrzenie nazw. Przestrzenie nazw XML wyglądają jak <soap:Envelope xmlns:soap="...">. Zapytania bez obsługi przestrzeni nazw nie znajdą elementów. To jeden z najczęstszych błędów parsowania XML.
  • Wrażliwość na białe znaki. Białe znaki między elementami są technicznie znaczące w XML (w odróżnieniu od HTML). Większość parserów radzi sobie z tym sensownie, ale może to powodować niespodzianki przy porównywaniu dokumentów.
  • Kodowanie znaków. Deklaracja XML powinna odpowiadać faktycznemu kodowaniu pliku. Plik UTF-8 zadeklarowany jako ISO-8859-1 będzie parsowany niepoprawnie dla wszystkich znaków spoza ASCII.
  • Brak natywnego typu tablicowego. XML nie ma tablic. Listy reprezentujesz przez powtarzanie elementów, co oznacza, że parsery zwracają NodeListy zamiast tablic JavaScript — zawsze konwertuj za pomocą Array.from() lub operatora spread.

Przydatne narzędzia do pracy z XML

Regularnie pracujesz z XML? Te narzędzia zaoszczędzą Ci czasu: XML Formatter do czytelnego formatowania zminifikowanych odpowiedzi XML, XML Validator do sprawdzania poprawności składniowej, XML to JSON do konwersji odpowiedzi XML na JSON dla łatwiejszej obsługi, oraz XML XPath do testowania zapytań XPath na dokumencie.

Podsumowanie

XML jest bardziej rozbudowany i złożony niż JSON, ale nie jest reliktem przeszłości — to fundament SVG, dokumentów Office, kanałów RSS, usług SOAP i interfejsów użytkownika Androida. Rozumienie różnicy między elementem a atrybutem, między poprawnym składniowo a poprawnym schematycznie XML-em, oraz znajomość typowych pułapek związanych z kodowaniem encji i przestrzeniami nazw przyda Ci się zawsze, gdy XML pojawi się w Twojej pracy. A pojawi się na pewno.