Podstawy#

Węzły znakowe#

Węzły znakowe to wspólna nazwa dla wszystkich węzłów, które dziedziczą po interfejsie CharacterData. Na dzień dzisiejszy będą nimi następujące interfejsy:

Wszystkie węzły znakowe zostały skojarzone z tymi samymi podstawowymi zagadnieniami i w wielu obszarach zachowują się bardzo podobnie. W tym miejscu doprecyzuję kilka najważniejszych kwestii oraz, w razie potrzeby, umieszczę osobno dodatkowe informacje na temat każdego z nich.

Text#

W prawidłowych dokumentach XML i HTML węzły tekstowe mogą występować tylko w węzłach typu Element. Poprzednie specyfikacje DOM dopuszczały także węzły typu Attr w roli rodziców dla węzłów tekstowych, ale w najnowszej specyfikacji DOM4 atrybuty zostały całkowicie przedefiniowane.

Jeśli w elemencie nie ma żadnych znaczników, jedynie sam tekst (nawet jeden znak spacji lub znak nowego wiersza), to jest on reprezentowany przez pojedynczy węzeł tekstowy, który będzie jedynym dzieckiem w danym elemencie. Jeśli w elemencie znajduje się jakaś struktura znacznikowa, to każdy z zagnieżdżonych elementów może posiadać kolejne węzły tekstowe.

Kiedy dokument jest pierwszy raz udostępniany w DOM, to istnieje tylko jeden węzeł tekstowy dla każdego bloku tekstu # w elemencie. Użytkownicy mogą utworzyć z poziomu skryptu dowolną liczbę sąsiadujących ze sobą węzłów tekstowych, które nie będą miały żadnego wyraźnego odzwierciedlenia w strukturze znacznikowej, ale należy mieć świadomość, że nie ma sposobu, aby zaprezentować granicę między takimi węzłami w dokumentach XML i HTML.

Za pomocą metody Node.normalize() można połączyć w jeden węzeł tekstowy wszystkie sąsiadujące węzły tekstowe dla każdego bloku tekstu.

Dla lepszego zobrazowania zagadnienia zamieszczam prosty przykład znacznikowej struktury HTML:

  1. L
  2. K
  3. T'
  4. T
  5. A
  6. O
  7. Z'
  8. Z
  9. #
<div>
	Pierwszy blok tekstowy w DIV
	<br>
	Drugi blok tekstowy w DIV
	Wciąż drugi blok tekstowy w DIV
	<p>Pierwszy blok tekstowy w P</p>
	<!-- Niewidoczny trzeci pusty blok tekstowy w DIV -->
</div>

Drzewo węzłów dla powyższego przykładu przyjmuje następującą postać (zgodnie z narzędziem Live DOM Viewer, ale z pominięciem komentarza, który w tym wypadku pełni rolę informacyjną):

Z poziomu skryptu każdy węzeł tekstowy w drzewie węzłów można podzielić na wiele różnych węzłów tekstowych, oczywiście można także dodać dowolną liczbę kolejnych węzłów tekstowych z nową treścią. Warto zwrócić uwagę na ostatni węzeł tekstowy, który reprezentuje znak nowego wiersza (oznaczyłem go symbolem "*"), i który na pierwszy rzut oka można przeoczyć (głównie przez początkujących programistów).

Comment#

Węzły komentarzowe (lub krótko komentarze) będą utożsamiane z komentarzami XML czy HTML, które szczegółowo opisałem w kursie HTML 4.01 (dział "Formatowanie treści - Komentarze") oraz kursie HTML5.

Z perspektywy struktury znacznikowej danymi tekstowymi w węzłach komentarzowych będą wszystkie znaki umieszczone między początkowym łańcuchem "<!--" a końcowym łańcuchem "-->".

Komentarze są specyficznymi obiektami, mogą należeć do aktywnego drzewa dokumentu, chociaż ich dane tekstowe nie będą wizualizowane na ekranie monitora.

ProcessingInstruction#

Instrukcje przetwarzania (w skrócie PI) to specjalne polecenia o określonej składni, które będą przekazywane przez parser XML do innych modułów w miejscu, w którym polecenia takie zostały umieszczone. PI mogą występować w dowolnej liczbie i dowolnym miejscu dokumentu.

Instrukcje przetwarzania mają zastosowanie jedynie w dokumentach XML (chociaż w przeszłości były definiowane również dla HTML 4.01). Można je wykorzystać do różnych funkcji, które najczęściej są nadrzędne dla samych znaczników. Przykładem może być dołączanie arkusza stylów CSS lub wykonanie transformacji XSL (XSLT). Niektóre instrukcje przetwarzania, np. dla wspomnianych arkuszy stylów, mają swój własny standard Associating Style Sheets with XML documents 1.0 (Second Edition).

Składnia PI została dokładnie zdefiniowana w specyfikacji XML:

  1. L
  2. K
  3. T'
  4. T
  5. A
  6. O
  7. Z'
  8. Z
  9. #
PI			::=		'<?' PITarget (S (Char* - (Char* '?>' Char*)))? '?>'
PITarget	::=		Name - (('X' | 'x') ('M' | 'm') ('L' | 'l'))

W ujęciu praktycznym składnię PI najlepiej scharakteryzować przy użyciu uproszczonego zapisu znacznikowego:

  1. L
  2. K
  3. T'
  4. T
  5. A
  6. O
  7. Z'
  8. Z
  9. #
<?target instructions ?>

gdzie poszczególne człony oznaczają:

PI w swojej deklaracji rozpoczynają się celem służącym do identyfikacji modułu, do którego dane tekstowe (często nazywane instrukcjami) są kierowane. Nazwa celu w postaci "XML" (o dowolnej wielkości znaków) jest zarezerwowana przez specyfikację XML dla kolejnych standardów i nie może być używana przez implementacje do wskazywania dowolnych modułów (chociaż aktualne przeglądarki internetowe są tutaj mniej restrykcyjne i nie zwracają na to uwagi).

Dane tekstowe w PI nie należą do danych tekstowych dokumentu, aczkolwiek muszą być umieszczane wraz z całym węzłem w drzewie DOM oraz zostać przekazane do wykonania dla konkretnych modułów.

Istnieje konwencja zapisywania danych tekstowych w instrukcji przetwarzania tak, jak zapisuje się atrybuty i ich wartości w elementach, ale nie jest to wymagane przez standard XML.

Aplikacje klienckie mogą wprowadzać dowolne moduły obsługujące instrukcje przetwarzania, przykładowo polecenie <?php echo "test"; ?> mogłoby wywoływać procesor PHP w celu wykonania przekazanego kodu. W praktyce jednak przeglądarki internetowe, jeśli już wspierają XML, to oferują jedynie obsługę technologii ściśle powiązanych z XML-em i standaryzowanych przez W3C. Łatwo je rozpoznać po zarezerwowanej nazwie celu, gdyż składnia instrukcji przetwarzania w ich przypadku będzie rozpoczynała się zawsze od znaków "<?xml-".

Prosty przykład z dołączaniem arkuszy stylów:

  1. L
  2. K
  3. T'
  4. T
  5. A
  6. O
  7. Z'
  8. Z
  9. #
<?xml-stylesheet type="text/css" href="style.css" ?>
<?xml-stylesheet type="text/xsl" href="style.xsl" ?>

Warto wspomnieć, że deklaracja XML (XML declaration), czyli np. polecenie <?xml version="1.0" ?>, nie jest instrukcją przetwarzania (ani też deklaracją typu dokumentu), chociaż wygląda bardzo podobnie. Prolog nie jest żadnym węzłem, może wystąpić tylko raz na początku dokumentu i jego instrukcje są kierowane bezpośrednio do parsera XML.

Pasek społecznościowy

SPIS TREŚCI AKTUALNEJ STRONY

Podstawy (H1) Węzły znakowe (H2) Text (H3) Comment (H3) ProcessingInstruction (H3)