Итерация по многоуровневому файлу XML - PullRequest
0 голосов
/ 09 октября 2019

Предположим, XML-файл имеет следующую структуру (ниже). Все «семейные» узлы различной глубины находятся под корневым элементом. (Извиняюсь за возможные неправильные термины; новое в этом материале XML.)

Под узлом "Семейство" есть слои "Предков" или поколений. Таким образом, в приведенном ниже примере «Дэвид» (уровень 1) имеет отца по имени «Самуил» (уровень 2), у которого есть отец по имени «Фред» (уровень 3) и т. Д.

Есть несколько "Семейные "узлы. Каждое семейство может иметь различное количество слоев «предков». В приведенном ниже примере «Предки» имеют глубину 5 поколений. Другие «семейные» узлы могут иметь глубину 3 или 8 поколений. Число поколений в каждом узле «Семейство» неизвестно.

Мне нужно отображать имена следующим образом:

David ->Samuel->Fred->John->Frank->Robert  (for a 5 generation list)
Mary->Lisa->Karen  (for a 3 generation list)

Так что мне нужно перебрать каждый узел Семейства как «глубокий»'(количество «поколений»), как эта семья, и составьте список имен, как указано выше. Количество поколений может быть разным для каждой семьи.

 <root>
    <Family>
        <ID>7588784011</ID>
        <Name>David</Name>
        <Ancestors>
            <Family>
                <ID>157050011</ID>
                <Name>Samuel</Name>
                <Ancestors>
                    <Family>
                        <ID>157028011</ID>
                        <Name>Fred</Name>
                        <Ancestors>
                            <Family>
                                <ID>154606011</ID>
                                <Name>John</Name>
                                <Ancestors>
                                    <Family>
                                        <ID>133141011</ID>
                                        <Name>Frank</Name>
                                        <IsCategoryRoot>1</IsCategoryRoot>
                                        <Ancestors>
                                            <Family>
                                                <ID>133140011</ID>
                                                <Name>Robert</Name>
                                            </Family>
                                        </Ancestors>
                                    </Family>
                                </Ancestors>
                            </Family>
                        </Ancestors>
                    </Family>
                </Ancestors>
            </Family>
        </Ancestors>
    </Family>
    <Family>
        // more ancestors of a varying number
    </Family>
 </root>

Спасибо.

Добавлено

Я достиг определенного прогресса в этом,с кодом, как показано в разделе Мой код здесь https://3v4l.org/GV0UV. Код содержит XML-содержимое, имена членов семьи которого начинаются с разных номеров для каждого семейства.

Я получаю имена выходных данных каждого члена семьи, но все имена находятся в одной строке. Намерение состоит в том, чтобы имена каждой семьи отображались в отдельной строке.

Поэтому мне нужно вставить <br>, когда семья изменится.

1 Ответ

0 голосов
/ 09 октября 2019

Это сводится к основам информатики. У вас есть рекурсивная древовидная структура, и для манипулирования ею вы, как правило, захотите использовать рекурсивный алгоритм обхода дерева. Вот почему многие находят XSLT самым простым решением для обработки XML, поскольку рекурсивный шаблон обхода дерева встроен в его модель обработки (xsl: apply-templates и template rules).

Но вы можете сделатьТо же самое в любом современном языке программирования. Основной строительный блок - это функция, которая выполняет:

function process(element X) {
  do something with X
  for each child C of X {
     process(C)
  }
  do something more with X
}

К сожалению, терминология деревьев XML противоречит терминологии вашего семейного дерева, поскольку вы используете дочерние узлы в XML для представления предков в вашей семье. Это просто то, на что нужно обратить внимание, чтобы вы не запутались.

Поскольку ваше дерево на самом деле не ветвится (никто, кажется, не имеет более одного непосредственного предка), решение на самом деле можно упростить;в XPath 2.0 это просто string-join(//Name, '->'). Но, возможно, здесь используется свойство вашего примера, которое не обобщается на реальные данные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...