Я пытаюсь добавить дочернюю заметку в файл XML с помощью PHP. Я использовал один и тот же метод примерно 5 раз раньше, и каждый работает так, как ожидалось, однако этот метод использует другую структуру xml для нового файла (что, я думаю, может быть частью проблемы).
Метод, вызывающий у меня проблему, заключается в следующем:
function addCourseToProject($name, $project){
$projects = self::getRoles();
$theProject = $projects->xpath('project[name = "'.$project.'"]');
echo $theProject->name;
$theCourses = $theProject[0]->courses->addchild("course", $name);
$projects->asXml("projects.xml");
}
Файл XML выглядит так:
<projects>
<project>
<name>Alpha</name>
<courses>
<course>Beta</course>
<course>Charlie</course>
</courses>
</project>
</project>
И getRoles()
выглядит так:
function getRoles(){
$roles = simplexml_load_file("projects.xml") or die("ERROR: Unable to read file");
return $roles;
}
Я здесь не понимаю, я понятия не имею, почему это отличается от других функций добавления (см. Ниже).
Если кто-то может оказать некоторую помощь, я был бы признателен :)
Пример того, как выглядят мои другие методы:
function addModule($courseName, $name, $link){
$xml = self::getXml();#get the xml file
$course = $xml->xpath('course[name = "'.$courseName.'"]');
$module = $course[0]->addChild("module");
$module->addChild("name", $name);
$module->addChild("link", $link);
$xml->asXml("data.xml");
echo self::toJSON($course);
}
и метод getXML()
:
function getXml(){
$xml=simplexml_load_file("data.xml") or die("ERROR: Unable to read file");
return $xml;
}
Оказалось, что проблема была вызвана тем, что элемент <project>
вложен в XML-документ. Вы можете использовать ось descendant-or-self
(//
для сокращенного синтаксиса), чтобы получить вложенный элемент следующим образом:
$theProject = $projects->xpath('//project[name = "'.$project.'"]');
или указать полный путь:
$theProject = $projects->xpath('/projects/project[name = "'.$project.'"]');
<name>"Alpha"</name>
... хотя я мог бы реструктурировать XML-файл, если это облегчит эту задачу?