php xml dom getElementById и запрос DOMXpath не удается получить элемент

У меня есть некоторые проблемы с созданием функции для замены элементов вопросов и ответов в моем файле XML. Я провел много исследований, изучая php dom, но я застрял в создании этой функции. Проблема в том, что когда я пытаюсь получить строку родительского элемента по идентификатору атрибута, он возвращает null или когда я использую xpath, он возвращает пустой объект. Я не знаю, будет ли функция работать правильно после того, как я получу правильный родительский элемент, но я думаю, что это следующий шаг.

мой XML выглядит так:

<?xml version="1.0" encoding="UTF-8"?>
<root>
  <row id="1">
    <question>Wat doet de vuilnisman?</question>
    <answer>Hij tilt de vuilnisbak in de vuilnisauto.</answer>
  </row>
  <row id="2">
    <question>Wat zegt de tandarts vaak?</question>
    <answer>U mag nu spoelen.</answer>
  </row>
</root>

и моя функция php:

//modifies rows
function modifyRows($file, $rowIds, $rowText) {
    $xmlDoc = new DOMDocument();
    $xmlDoc->preserveWhiteSpace = false;
    $xmlDoc->formatOutput = true;   
    $xmlDoc->load($file);
    foreach($rowIds as $rowId) {
        $parent = $xmlDoc->getElementById($rowId);
        for($i=0;$i<count($rowText);$i++) {
            $newQ = $xmlDoc->createElement('question');
            $qText = $xmlDoc->createTextNode($rowText[$i]);
            $qText = $newQ->appendChild($qText);
            $newA = $xmlDoc->createElement('answer');
            $aText = $xmlDoc->createTextNode($rowText[$i++]);
            $aText = $newA->appendChild($aText);
        }
        $oldQ = $parent->getElementsByTagName('question');
        $oldA = $parent->getElementsByTagName('answer');        
        $parent->replaceChild($newQ, $oldQ);
        $parent->replaceChild($newA, $oldA);
    }   
    $xmlDoc->save($file);
}

$rowIds — это массив, содержащий номера строк, которые были изменены, и rowText в массиве, который содержит строки вопросов и ответов, такие как массив (0 => «вопрос», 1 => «ответ») и т. д. Содержимое XML-файла может увеличиваться или уменьшаться путем добавления или удаления строк. Для этого я уже сделал "рабочие" функции.


person Zeebats    schedule 25.04.2013    source источник
comment
А ваш вопрос?   -  person hakre    schedule 25.04.2013
comment
Как мне получить этот родительский элемент по идентификатору атрибута, потому что это проблема, которую я объяснил. Запрос getElementById и xpath для получения элемента по идентификатору не возвращают элемент.   -  person Zeebats    schedule 25.04.2013
comment
Если xpath и getElementById уже не возвращают элемент, из которого вы хотите получить родителя, то ваш вопрос должен заключаться в том, как сначала получить сам элемент, bevore думая о получении родителя. Вот почему я спрашиваю. Что пошло не так с Getelementbyid? Эта функция должна нормально работать, если для идентификатора не установлено другое имя атрибута (что не относится к вашему примеру XML).   -  person hakre    schedule 25.04.2013
comment
Я хочу, чтобы xpath и getelementbyid возвращались как родитель. поэтому я могу изменить дочерние элементы этого элемента. Я думаю, что это немного странно, что я не могу получить строку элемента по его идентификатору.   -  person Zeebats    schedule 25.04.2013
comment
Что вы можете. Я имею в виду, что это действительно работает. И тогда родителем будет parentElement в DOMDocument IIRC, а для xpath это .., как в файловой системе. Однако кажется, что ваша проблема находится в другом месте, потому что вы уже не можете получить элемент с идентификатором, не так ли?   -  person hakre    schedule 25.04.2013
comment
У меня также есть функция removeRow. Эта функция основана на том же массиве rowId. но эта функция прекрасно работает.   -  person Zeebats    schedule 25.04.2013
comment
Ну, вероятно, вы делаете слишком много в одной функции. Если бы обе функции могли повторно использовать работающую часть, разве это не было бы здорово? Было бы меньше мест, где могут возникать ошибки, и меньше мест для отладки.   -  person hakre    schedule 25.04.2013
comment
Кроме того, я вижу в вашем коде, что вы не добавляете элемент, который создаете. Наверное, это ваша проблема? Отсутствуют элементы, которые вы хотите добавить туда?   -  person hakre    schedule 25.04.2013
comment
когда я запускаю функцию, я получаю сообщение об ошибке: вызов функции-члена getElementsByTagName() для не-объекта. Если это то, что вы имеете в виду, не добавляя. Я думаю, что эта ошибка возникает из-за того, что $parent имеет значение null, когда я проверяю, является ли оно значением null   -  person Zeebats    schedule 25.04.2013
comment
давайте продолжим это обсуждение в чате   -  person hakre    schedule 25.04.2013


Ответы (1)


Я решил проблему благодаря hakre и интернету. Так что для людей с той же проблемой я решил это так.

    function getElementById($id) {
        $xpath = new DOMXPath($this->xmlDoc);
        return $xpath->query("//*[@id='$id']")->item(0);
    }
person Zeebats    schedule 30.04.2013