Ekleme, güncelleme ve PHP ile bir XML dosyasını düzenlemek

3 Cevap php

Ben PHP kullanarak kayıtlarını eklemek düzenlemek ve silmek için etrafında bir form / tablo oluşturmak istiyorum bir xml dosyası var. Şu anda XML dosyası yüklemek ve çeşitli sayfalarda içeriği görüntülemek için SimpleXML kullanın.

Ben tüm sonuçlarını gösteren bir tablo oluşturabilirsiniz herhangi bir yolu var mı ve bana XML dosyası içinde tam bir kaydını temsil tablo düzenlemek veya silmek o satır ya da sağlar.

Düzenlemek tıklayarak ne zaman XML dosyası ve ilgili web sayfası güncelleme, kullanıcı değiştirmek ve sonra dışarı kaydedebilirsiniz formda görünmesini kaydından ayrıntıları istiyorum.

Bu PHP ile bunu yapmak için başka yollar önerilere açık olsa da, tercihen, SimpleXML kullanarak, PHP yapılması gerekir.

Şerefe

3 Cevap

XSLT Eğer web sayfasında görüntülemek istediğiniz biçime XML veritabanı dosya dönüştürme için arkadaşım. Her kayıt için istediğiniz tüm HTML içeren bir XSL şablonu oluşturmak ve sonra için-her deyimi ile XML dosyası boyunca yineleme. Ben kaba bir bakış vereceğiz ve gerekirse daha fazla bilgi yardımcı olabilir.

İşte AJAX XSLT (XSL dosya ile bir XML dosyası işlemek) yapmak için kullanabileceğiniz genel amaçlı bir PHP dosyasıdır. Bu bir tarayıcıdan bir GET çağrısına geçirilen gerekli (ve isteğe bağlı, arzu edilirse) girişli çalışmak için kurulum olduğunu. p # n ve p # v (aşağıda kod üstündeki yorumlara bakınız) Eğer çıktıyı etkileyen bazı girdi parametresini kullanmak istediğiniz durumlarda XSL belgeye geçirilecek parametre ve değer çiftleri vardır. Bu durumda çıkış tarayıcıya geri yankılandı. Burada web ekran (tablo, ya da ne olursa olsun XSL dosyası şablonunun koymak) için HTML oluşturmak için dönüşüm yoluyla ve XSLT XML veritabanı çalıştırmak için PHP bulunuyor:

<?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");
?> 

Aşağıda bir XML veritabanı belgesi alarak ve bir web sayfası ekleme için HTML dönüştürerek bir XSL dosyası şablonunun bir örnektir. HTML span etiketleri unutmayın. Tüm xsl etiketleri şablonda HTML etiketleri ve etrafında neler olup bittiğini belirler talimatları işliyoruz. Bu durumda, biz sonuçları filtreleme ve (xsl bakınız: yakın üst param öğeler) XSL dosyasına iletilir girdi parametrelerine dayalı görüntülemek için uygun verileri tercih ediyor:

<?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>

Tüm xsl testler XPath ifadeleri olduğunu unutmayın.

Bir satır silmek için, satır referans (yukarıdaki kod onClick = 'remProdLink (bu)' bakın) "bu" argüman ile bir JavaScript işlevini çağıran satırda bir düğme var, sonra benzersiz tanımlayıcı kapmak Böyle JavaScript şey satır:

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
}

Sunucu ucunda, PHP, benzersiz bir tanımlayıcı ile AJAX POST aldığı SimpleXML içine XML veritabanı dosyası yükler, XPath yoluyla düğümü bulur, ve, böyle bir şey kaldırır:

<?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');
?>

Bir öğeyi düzenlemek için olduğu gibi, bir değişiklikleri kaydetmek düğme ile web sayfasında o öğenin altında bir form oluşturmak, yukarıda belirtildiği gibi silinmesi için birine benzer adlı başka bir JavaScript işlevi vardır ve olabilir düğme çağrı başka bir JavaScript fonksiyonu basıldığında Yine benzer şekilde silme sunucuya AJAX POST. Sadece bu kez POST kaydın benzersiz fikir ile birlikte kayıtlarında düzenlenmiş olabilirdi tüm bilgileri dahil etmek gerekir. PHP dosyası uygun kaydı (silme işlemi için aynı) bulacaksınız, ve o zaman sadece düzenleme PHP bu kaydın parçaları, ya da kaldırmak ve oluşturmak ve kaydın yeni sürümünü ekleyebilirsiniz.

Ben kaç ihtiyacınız detayları emin değilim. Umarım bu size iyi bir başlangıç ​​verir. Bunun herhangi bir bölümünde daha fazla bilgi gerekiyorsa, benim cevap konusunda yorum yapın. İyi şanslar!

Seni çok SimpleXML daha DomDocument ve DOMXPath, kullanmanızı öneririm. Ancak, genel olarak, XML veri depolama için optimum bir ortam değildir - Muhtemelen bunu yapıyoruz ne olursa olsun için bir veritabanı kullanmanız gerekir. Kolayca veri alışverişi için gerekiyorsa, belki de bunun yerine daha yaygın MySql, SQLite kullanabilirsiniz.

Siz, yaratma ekleyerek, güncellenmesi ve xml belgeleri ve düğümleri almak kolaylaştırmak için yerel XML veritabanı kullanabilirsiniz. Ben başarı ile geçmişte BerkeleyDBXML (Oracle şimdi parçası) kullandım. Mevcut bir PHP kütüphanesi de var mi.