Порядок документов равен , определен как
Существует порядок, порядок документов , определенный на всех узлах вдокумент, соответствующий порядку, в котором первый символ представления XML каждого узла встречается в представлении XML документа после раскрытия общих сущностей.Таким образом, корневой узел будет первым узлом.Элемент узлов встречается раньше своих детей.Таким образом, порядок документов упорядочивает узлы элементов в порядке появления их начального тега в XML (после раскрытия сущностей).
Другими словами, порядок, в котором вещи встречаются в документе XML,Модуль XML :: XPath выдает результаты в порядке документа.Например:
#! /usr/bin/perl
use warnings;
use strict;
use XML::XPath;
my $entity_template = "/Entities"
. "/Entity"
. "[EntityName='!!NAME!!']"
;
my $tables_path = join "|" =>
qw( ./Tables/DataTables/DataTable
./Tables/OtherTables/OtherTable );
my $xp = XML::XPath->new(ioref => *DATA);
foreach my $ename (qw/ foo bar /) {
print "$ename:\n";
(my $path = $entity_template) =~ s/!!NAME!!/$ename/g;
foreach my $n ($xp->findnodes($path)) {
foreach my $t ($xp->findnodes($tables_path, $n)) {
print $t->toString, "\n";
}
}
}
__DATA__
Первое выражение ищет элементы <Entity>
, каждый из которых имеет дочернего элемента <ElementName>
, чье строковое значение является выбранным именем объекта.Оттуда мы ищем <DataTable>
или <OtherTable>
.
При заданном вводе
<Entities>
<Entity>
<EntityName>foo</EntityName>
<EntityType>type1</EntityType>
<Tables>
<DataTables>
<DataTable>1</DataTable>
<DataTable>2</DataTable>
</DataTables>
<OtherTables>
<OtherTable>3</OtherTable>
<OtherTable>4</OtherTable>
</OtherTables>
</Tables>
</Entity>
<Entity>
<EntityName>bar</EntityName>
<EntityType>type2</EntityType>
<Tables>
<DataTables>
<DataTable>5</DataTable>
<DataTable>6</DataTable>
</DataTables>
<OtherTables>
<OtherTable>7</OtherTable>
<OtherTable>8</OtherTable>
</OtherTables>
</Tables>
</Entity>
</Entities>
на выходе получается
foo:
<DataTable>1</DataTable>
<DataTable>2</DataTable>
<OtherTable>3</OtherTable>
<OtherTable>4</OtherTable>
bar:
<DataTable>5</DataTable>
<DataTable>6</DataTable>
<OtherTable>7</OtherTable>
<OtherTable>8</OtherTable>
Для извлечения строковых значений(«внутренний текст»), измените $tables_path
на
my $tables_path = ". / Tables / DataTables / DataTable / text() |
. / Tables / OtherTables / OtherTable / text()";
Да, это повторяется, потому что XML :: XPath реализует XPath 1.0 .
Вывод:
foo:
1
2
3
4
bar:
5
6
7
8