Разобрать XML во вложенный список с помощью PHP - PullRequest
1 голос
/ 11 декабря 2010

У меня есть XML-файл, который содержит данные семейного дерева во вложенной структуре, и я хочу разобрать его во вложенный список.

У меня есть следующий код

<?php 
    $doc = new DOMDocument();
    $doc->load('armstrong.xml');
    echo $doc->saveXML();
?>

Который загружает в следующий XML-файл и печатает его как есть

<?xml version="1.0" encoding="UTF-8"?>
<indi>
    <id>id1</id>
    <fn>Matt</fn>
    <bday>1919</bday>
    <dday>2000</dday>
    <spouse>Evelyn Ross</spouse>
    <family>
        <indi>
        <id>id2</id>
        <fn>Jane</fn>
        <bday></bday>
        <dday></dday>
        <spouse></spouse>
        <family>

        </family>
    </indi>
    <indi>
        <id>id3</id>
        <fn>Jason</fn>
        <bday></bday>
        <dday></dday>
        <spouse></spouse>
        <family>

        </family>
    </indi>
    <indi>
        <id>id4</id>
        <fn>Samuel</fn>
        <bday></bday>
        <dday></dday>
        <spouse></spouse>
        <family>
            <indi>
                <id>id5</id>
                <fn>John</fn>
                <bday></bday>
                <dday></dday>
                <spouse></spouse>
                <family>

                </family>
            </indi>
            <indi>
                <id>id6</id>
                <fn>John</fn>
                <bday></bday>
                <dday></dday>
                <spouse></spouse>
                <family>

                </family>
            </indi>
        </family>
    </indi>
</family>

Однако я хочу разобрать его в следующий формат:

<ul>
   <li> 
    <span class="vcard person" id="id1">
            <span class="edit fn">Matt</span> 
        <span class="edit bday">1956</span> 
        <span class="edit dday"></span>
            <span class="edit spouse">Eunace Fulton</span>
        </span> 
    <ul> ... List of Family ... </ul>
   </li>
</ul>

IЯ новичок в php, поэтому, если это невероятно простая проблема, я прошу прощения!Буду очень признателен за любые идеи.

РЕДАКТИРОВАТЬ

Я сейчас использую следующий рекурсивный цикл, но все еще возникают проблемы

$doc = new DOMDocument();
    $doc->load('armstrong.xml');

    function outputIndi($indi) {
        $i = new DOMDocument();
        $i = $indi;

        echo '<li>';

        echo '<span class="edit fn">' . $indi->getElementsByTagName("fn") . '</span>'; // name not a real attribute, must access through DOM
        echo '<span class="edit bday">' . $indi->getElementsByTagName("bday") . '</span>'; // ditto
        // ...

        echo '<ul>';
        foreach ($indi->getElementsByTagName("family") as $subIndi) { // again, family not a real attribute
            outputIndi($subIndi);
        }
        echo '</ul>';

        echo '</li>';
    }

    outputIndi($doc->documentRoot);

    ?>

1 Ответ

1 голос
/ 11 декабря 2010

Вот ваш код.Вам нужно будет добавить остальные атрибуты (dday, spouse)

RECURSION!

function outputIndi($indi) {
    echo '<li>';
    $id = $indi->getElementsByTagName('id')->item(0)->nodeValue;
    echo '<span class="vcard person" id="' . $id . '">';

    $fn = $indi->getElementsByTagName('fn')->item(0)->nodeValue;
    $bday = $indi->getElementsByTagName('bday')->item(0)->nodeValue;

    echo '<span class="edit fn">' . $fn . '</span>';
    echo '<span class="edit bday">' . $bday . '</span>';
    // ...

    echo '<ul>';
    $family = $indi->getElementsByTagName('family')->item(0)->childNodes;
    foreach ($family as $subIndi) {
        outputIndi($subIndi);
    }
    echo '</ul>';
    echo '</span>';
    echo '</li>';
}

$doc = new DOMDocument();
$doc->load('armstrong.xml');

outputIndi($doc->documentElement);

Видите ли, он выводит всю информацию о "инди", проходит через каждого потомка <family> и вызывает себя на этом.Имеет ли это смысл?

...