#parsing
#синтаксический анализ
Вопрос:
Во-первых, извинения, поскольку я понимаю, что это только косвенно связано с программированием синтаксического анализатора.
Я потратил часы на поиск текстового файла, содержащего что-то вроде следующего, но с сотнями (надеюсь, тысячами) вложенных записей. Полный файл биологической классификации был бы идеальным. Массовая версия следующего была бы отличной, поскольку мой анализатор анализирует простые файлы с вкладками:
TL, DR — Мне нужен массивный однофайловый иерархический набор данных примерно следующего вида:
Kindoms
Monera
Protista
Fungi
Plants
Animals
Porifera
Sponges
Coelenterates
Hydra
Coral
Jellyfish
Platyhelminthes
Flatworms
Flukes
Nematodes
Roundworms
Tapeworms
Chordates
Urochordataes
Cephalochordates
Vertebrates
Fish
Amphibians
Reptiles
Birds
Mammals
Лучшее, что я смог найти, — это изображения дерева жизни (из которых я расшифровал образец набора данных выше). Один файл с ТОННОЙ реальных данных был бы потрясающим. Это не обязательно должен быть набор данных биологической классификации, но мне бы очень хотелось, чтобы данные отражали что-то в реальном мире. (Мой анализатор выдает меню — было бы здорово, если бы оставшаяся часть моего тестирования была с набором данных, который действительно что-то значил!) Даже если в файле нет вкладок, но данные были довольно легко переведены в формат с вкладками … это было бы здорово.
Есть идеи? Спасибо!
Ответ №1:
Возможно, что макет xml был изменен с момента последнего ответа, но приведенный выше код больше не является точным. Результирующий дамп является посторонним. У некоторых узлов есть псевдонимы (обозначаемые как ‘othername’), которые сообщаются как отдельные узлы.
Я использовал приведенный ниже скрипт для создания правильного дампа.
<?php
$reader = new XMLReader();
$reader->open('http://tolweb.org/onlinecontributors/app?service=externalamp;page=xml/TreeStructureServiceamp;node_id=1'); //15963 is the primates index
$set=-1;
while ($reader->read()) {
switch ($reader->nodeType) {
case (XMLREADER::ELEMENT):
if ($reader->name == "OTHERNAMES"){
$set=1;
}
if ($reader->name == "NODES"){
$set=-1;
}
if ($reader->name == "NODE"){
$set=-1;
}
if ($reader->name == "NAME" AND $set == -1){
echo str_repeat("t", $reader->depth - 2); //repeat tabs for depth
$node = $reader->expand();
echo $node->textContent . "n";
}
break;
}
}
?>
Ответ №2:
Это оказалось такой занозой в заднице. Я, наконец, отследил поток данных из «Веб-проекта Tree of Life» по адресу tolweb.org . Я создал приведенный ниже php-скрипт, чтобы обеспечить базовую функциональность, которую искал мой пост.
Измените node_id, чтобы он печатал представление с вкладками любого из tolweb.org данные пользователя — просто возьмите идентификатор со страницы, которую вы просматриваете на их сайте, и измените node_id ниже.
Однако имейте в виду — их каналы данных обслуживают большие файлы, поэтому обязательно загрузите файл на свой собственный сервер (и измените метод «открыть» ниже, чтобы указать на локальный файл), если вы собираетесь использовать его более одного или двух раз.
Подробнее о tolweb.org каналы передачи данных можно найти здесь: http://tolweb.org/tree/home.pages/downloadtree.html
<?php
$reader = new XMLReader();
$reader->open('http://tolweb.org/onlinecontributors/app?service=externalamp;page=xml/TreeStructureServiceamp;node_id=15963'); //15963 is the primates index
while ($reader->read()) {
switch ($reader->nodeType) {
case (XMLREADER::ELEMENT):
if ($reader->name == "NAME"){
echo str_repeat("t", $reader->depth - 2); //repeat tabs for depth
$node = $reader->expand();
echo $node->textContent . "n";
}
break;
}
}
?>