Добавление, обновление и редактирование XML-файла с помощью PHP

У меня есть файл xml, в котором я хотел бы создать форму / таблицу для добавления, редактирования и удаления записей с помощью PHP. В настоящее время я использую simpleXML для загрузки XML-файла и отображения его содержимого на различных страницах.

Есть ли способ создать таблицу, которая показывает все результаты и позволяет мне редактировать или удалять эту конкретную строку таблицы, которая представляет собой полную запись в файле XML.

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

Мне нужно, чтобы это было сделано на PHP, предпочтительно с использованием SimpleXML, хотя я открыт для предложений других способов сделать это с помощью PHP.

Ваше здоровье

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
0
26 947
3

Ответы 3

Я бы посоветовал вам использовать DomDocument и DomXPath, а не SimpleXml. Однако в целом XML не является оптимальным носителем для хранения данных - вам, вероятно, следует использовать базу данных для того, что вы делаете. Если вам нужно легко обмениваться данными, вы могли бы использовать SQLite вместо более распространенного MySql.

Вы можете использовать собственную базу данных XML для облегчения создания, добавления, обновления и извлечения XML-документов и узлов. В прошлом я успешно использовал БерклиDBXML (теперь часть Oracle). Также доступна библиотека PHP.

XSLT - ваш друг для преобразования файла базы данных XML в формат, который вы хотите отображать на веб-странице. Вы создаете шаблон XSL, который включает весь HTML-код, который вы хотите для каждой записи, а затем выполняете итерацию по XML-файлу с помощью оператора for-each. Я дам приблизительный обзор и при необходимости могу помочь с более подробной информацией.

Вот общий файл PHP, который я использую для выполнения XSLT (обработки файла XML с файлом XSL) через AJAX. Этот настроен для работы с обязательными (и, если желательно, необязательными) входными данными, передаваемыми в вызове GET из браузера. p # n и p # v (см. комментарии в верхней части кода ниже) - это пары параметров и значений, которые должны быть переданы в документ XSL в тех случаях, когда вы хотите использовать какой-либо входной параметр, чтобы повлиять на вывод. В этом случае вывод возвращается обратно в браузер. Вот PHP для запуска базы данных XML и преобразование XSLT для создания HTML для вашего веб-дисплея (таблицы или того, что вы поместили в шаблон файла XSL):

<?php
//REQUIRED INPUTS:
// - xml: path to xml document
// - xsl: path to xsl style sheet
// - pCount: number of parameters to be passed to xslt (send zero '0' if none)
//OPTIONAL INPUTS (must have as many as specified in pCount, increment '1' in
//names below up a number for each iteration):
// - p1n: name of first parameter
// - p1v: value of first parameter

//SET Paths 
$xmlPath = $_GET['xml'];
$xslPath = $_GET['xsl'];

// Load the XML source
$xml = new DOMDocument;
$xml->load($xmlPath);

$xsl = new DOMDocument;
$xsl->load($xslPath);

// Configure the transformer
$proc = new XSLTProcessor;
$proc->importStyleSheet($xsl); // attach the xsl rules

//Set Parameter(s), if present
$xslParamCount = $_GET['pCount']; //Check number of xsl parameters specified in GET
for ($i=1; $i<=$xslParamCount; $i++){
   $xslParamName = $_GET['p'.$i.'n'];
   $xslParamValue = $_GET['p'.$i.'v'];
   $proc->setParameter( '', $xslParamName, $xslParamValue);    //Set parameters for XSLTProcessor
}

// TRANSFORM
echo $proc->transformToXML($xml);

// SET Mime Type
$mime = "application/xhtml+xml";
$charset = "iso-8859-1";
header("Content-Type: $mime;charset=$charset");
?> 

Ниже приведен пример шаблона файла XSL, который принимает документ базы данных XML и преобразует его в HTML для вставки на веб-страницу. Обратите внимание на теги HTML span. Все теги xsl представляют собой инструкции по обработке, которые определяют, что входит в теги HTML и вокруг них в шаблоне. В этом случае мы фильтруем результаты и выбираем соответствующие данные для отображения на основе входных параметров, переданных в файл XSL (см. Элементы xsl: param вверху):

<?xml version='1.0' encoding='UTF-8'?>
<xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0'>
 <xsl:param name='testId'/>
 <!--Input options for following param: localUse, notLocalUse, nottestId, or '' (all)-->
 <xsl:param name='matchType'/>
 <xsl:template match='/'>
   <xsl:choose>
      <xsl:when test = "$matchType='localUse'">
         <xsl:for-each select = "//test[@id=$testId and @localUse='yes']">
            <xsl:sort select = "../@id"/>
            <div><xsl:if test='../@localPrefTestId=$testId'><xsl:attribute name='class'>preferredTest</xsl:attribute></xsl:if>
               <span class='productStockCode'>
                  <xsl:if test='../@localPrefTestId=$testId'>
                     <xsl:attribute name='title'>Preferred test for this product</xsl:attribute>
                  </xsl:if>
                  <xsl:if test='../@localPrefTestId!=$testId'>
                     <xsl:attribute name='title'>Alternate (not preferred) test for this product - see note to right</xsl:attribute>
                  </xsl:if>
                  <xsl:value-of select='../@id'/>
               </span>
               <span class='productStockName'>
                  <xsl:if test='../@localPrefTestId=$testId'>
                     <xsl:attribute name='title'>Preferred test for this product</xsl:attribute>
                  </xsl:if>
                  <xsl:if test='../@localPrefTestId!=$testId'>
                     <xsl:attribute name='title'>Alternate (not preferred) test for this product - see note to right</xsl:attribute>
                  </xsl:if>
                  <xsl:value-of select='../@name'/>
               </span>
               <span class='producttestNote'>
                  <xsl:value-of select='child::localPrefNote'/>
               </span>
               <span class='productDeleteButton'>
                  <input onClick='remProdLink(this)' title='Click to remove link to this product' type='image' src='button_tiny_X_grey.bmp'></input>
               </span>
            </div>
         </xsl:for-each>
      </xsl:when>
      <xsl:otherwise>
         <p>Server Error: GET must specify matchType parameter value of 'localUse', 'notLocalUse', 'nottestId', or '' (for all)</p>
         <p>matchType received: <xsl:value-of select='$matchType'/></p>
      </xsl:otherwise>
   </xsl:choose>
 </xsl:template>
 <!--Note the output method = "html" below is required for this to insert correctly into a web page; without this it may nest improperly if any divs are empty-->
 <xsl:output method = "html" omit-xml-declaration = "yes"/>
</xsl:stylesheet>

Обратите внимание, что все тесты xsl являются выражениями XPath.

Чтобы удалить строку, у вас может быть кнопка в этой строке, которая вызывает функцию JavaScript с аргументом «this» (см. OnClick = 'remProdLink (this)' в коде выше) для ссылки на строку, а затем захватить уникальный идентификатор строка в JavaScript примерно такая:

function remProdLink(obj){
   //get unique id via Dom from passed in object reference
   //edit everything after "obj" below to get to the unique id in the record
   var testCode = obj.parentNode.parentNode.firstChild.nextSibling.innerHTML;
   //code to send AJAX POST to server with required information goes here
}

На стороне сервера ваш PHP получает POST AJAX с уникальным идентификатором, загружает файл базы данных XML в simpleXml, находит узел через XPath и удаляет его, примерно так:

<?php
   //Move url encoded post data into variables
   $testCode = $_POST['testCode']; //$testCode should be a unique id for the record

   //load xml file to edit
   $xml = simplexml_load_file('yourDatabase.xml');

   //find target node for removal with XPath
   $targets = $xml->xpath("//testCode[@id=$testCode]");

   //import simpleXml reference into Dom to do removal
   $dom2 = dom_import_simplexml($targets[0]);
   $dom2->parentNode->removeChild($dom2);

   //format xml to save indented tree (rather than one line) and save
   $dom = new DOMDocument('1.0');
   $dom->preserveWhiteSpace = false;
   $dom->formatOutput = true;
   $dom->loadXML($xml->asXML());
   $dom->save('yourDatabase.xml');
?>

Что касается редактирования элемента, у вас может быть другая функция JavaScript, вызываемая аналогично функции удаления, как указано выше, создать форму под этим элементом на веб-странице с кнопкой сохранения изменений, и при нажатии этой кнопки вызвать другую функцию JavaScript для AJAX POST на сервер, аналогично удалению. Только на этот раз ваш POST должен будет включать всю информацию, которая могла быть отредактирована в записи, вместе с уникальным идентификатором записи. Файл PHP найдет соответствующую запись (так же, как и при удалении), а затем вы можете либо отредактировать части этой записи в PHP, либо просто удалить ее, а затем создать и добавить новую версию записи.

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

ваш ответ включает строку в последней части кода относительно $ dom здесь: // импортировать ссылку simpleXml в Dom для удаления $ dom2 = dom_import_simplexml ($ target [0]); $ dom2-> parentNode-> removeChild ($ dom); но я не заметил, что $ dom инициализирован до этого фрагмента кода. Вы можете объяснить эту часть дальше? Спасибо за вклад и подробные образцы.

d48 06.02.2011 11:33

@predikt: Спасибо, что уловили опечатку. Это должно было быть removeChild ($ dom2). Ответ обновлен.

Witman 02.03.2012 13:39

Другие вопросы по теме