2010-12-22 43 views
5

如何使用使用Xpath(php)更新文件? 我的文件結構:使用php Xpath更新xml文件

<?xml version="1.0" encoding="ISO-8859-1"?> 
<PersonList> 
    <Person> 
    <Name>Sonu Kapoor</Name> 
    <Age>24</Age> 
    <Gender>M</Gender> 
    <PostalCode>54879</PostalCode> 
    </Person> 
    <Person> 
    <Name>Jasmin</Name> 
    <Age>28</Age> 
    <Gender>F</Gender> 
    <PostalCode>78745</PostalCode> 
    </Person> 
    <Person> 
    <Name>Josef</Name> 
    <Age>232</Age> 
    <Gender>F</Gender> 
    <PostalCode>53454</PostalCode> 
    </Person> 
</PersonList> 

,我需要更改值年齡和性別,其中名爲「茉莉」。我嘗試使用谷歌,但沒有好沒有發現:(

回答

5

您可以嘗試simplexml

$xml = simplexml_load_string($str); 
$obj = $xml->xpath('//Person[Name="Jasmin"]'); 
$obj[0]->Age = 30; 
$obj[0]->Gender = 'M'; 
echo $xml->asXml(); 

/* or */ 
$xml->asXml($filename); <-- save xml into file 
2

如何使用使用XPath(PHP)更新 文件?

XPath是XML文檔的查詢語言,因此只有XPath表達式不能修改XML文檔 - 它只能選擇節點或其他數據

一個修改後的XML文檔可以與正在託管XPath引擎編程語言的幫助下進行生產 - 這可能是XSLT,C#,Java,PHP和...

,我需要更改值年齡和 性別,其中名稱是「Jasmin」。

下面是根據這些要求產生一個新的XML文檔的簡單XSLT轉換:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:my="my:my" exclude-result-prefixes="my"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<my:params> 
    <name>Jasmin</name> 
    <age>31</age> 
    <gender>X</gender> 
</my:params> 

<xsl:variable name="vParams" select= 
"document('')/*/my:params"/> 

<xsl:template match="node()|@*" name="identity"> 
    <xsl:copy> 
    <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match= 
    "Person[Name=document('')/*/my:params/name]/Age"> 
    <Age><xsl:value-of select="$vParams/age"/></Age> 
</xsl:template> 

<xsl:template match= 
    "Person[Name=document('')/*/my:params/name]/Gender"> 
    <Gender><xsl:value-of select="$vParams/gender"/></Gender> 
</xsl:template> 
</xsl:stylesheet> 

當這個變換所提供的XML文檔施加:

<PersonList> 
    <Person> 
     <Name>Sonu Kapoor</Name> 
     <Age>24</Age> 
     <Gender>M</Gender> 
     <PostalCode>54879</PostalCode> 
    </Person> 
    <Person> 
     <Name>Jasmin</Name> 
     <Age>28</Age> 
     <Gender>F</Gender> 
     <PostalCode>78745</PostalCode> 
    </Person> 
    <Person> 
     <Name>Josef</Name> 
     <Age>232</Age> 
     <Gender>F</Gender> 
     <PostalCode>53454</PostalCode> 
    </Person> 
</PersonList> 

想要的,正確的結果產生

<PersonList> 
    <Person> 
     <Name>Sonu Kapoor</Name> 
     <Age>24</Age> 
     <Gender>M</Gender> 
     <PostalCode>54879</PostalCode> 
    </Person> 
    <Person> 
     <Name>Jasmin</Name> 
     <Age>31</Age> 
     <Gender>X</Gender> 
     <PostalCode>78745</PostalCode> 
    </Person> 
    <Person> 
     <Name>Josef</Name> 
     <Age>232</Age> 
     <Gender>F</Gender> 
     <PostalCode>53454</PostalCode> 
    </Person> 
</PersonList> 
1

您可以使用PHP中的DOMDocument。

你加載你的文件,然後循環通過文檔的childNodes。

<?php 
$dom=new DOMDocument(); 
$dom->load("file.xml"); 

$root=$dom->documentElement; // This can differ (I am not sure, it can be only documentElement or documentElement->firstChild or only firstChild) 

$nodesToDelete=array(); 

$markers=$root->getElementsByTagName('marker'); 

// Loop trough childNodes 
foreach ($markers as $marker) { 
    $type=$marker->getElementsByTagName('type')->item(0)->textContent; 
    $title=$marker->getElementsByTagName('title')->item(0)->textContent; 
    $address=$marker->getElementsByTagName('address')->item(0)->textContent; 
    $latitude=$marker->getElementsByTagName('latitude')->item(0)->textContent; 
    $longitude=$marker->getElementsByTagName('longitude')->item(0)->textContent; 

    // Your filters here 

    // To remove the marker you just add it to a list of nodes to delete 
    $nodesToDelete[]=$marker; 
} 

// You delete the nodes 
foreach ($nodesToDelete as $node) $node->parentNode->removeChild($node); 

echo $dom->saveXML(); 
?> 

您可以保存你的輸出這樣的XML

$dom->saveXML(); // This will return the XML as a string 
$dom->save('file.xml'); // This saves the XML to a file 

爲此分析在JavaScript中,你應該使用jQuery(一個小,但功能強大的庫)。

您可以直接從Google Code Repository包含該庫。

<script type="text/javascript" src="http://jqueryjs.googlecode.com/files/jquery-1.3.2.min.js"></script> 

該庫是跨瀏覽器,非常小。它應該被緩存在很多情況下,因爲一些網站使用谷歌代碼

$(yourXMLStringOrDocument).find("marker").each(function() { 
    var marker=$(this); 

    var type=marker.find('type').text(); 
    var title=marker.find('title').text(); 
    var address=marker.find('address').text(); 
    var latitude=marker.find('latitude').text(); 
    var longitude=marker.find('longitude').text(); 
}); 
0

我知道,我遲到了。這裏是基於純DOMXPath溶液:

<?php 
$content = <<<XML 
<?xml version="1.0" encoding="ISO-8859-1"?> 
<PersonList> 
    <Person> 
    <Name>Sonu Kapoor</Name> 
    <Age>24</Age> 
    <Gender>M</Gender> 
    <PostalCode>54879</PostalCode> 
    </Person> 
    <Person> 
    <Name>Jasmin</Name> 
    <Age>28</Age> 
    <Gender>M</Gender> 
    <PostalCode>78745</PostalCode> 
    </Person> 
    <Person> 
    <Name>Josef</Name> 
    <Age>232</Age> 
    <Gender>F</Gender> 
    <PostalCode>53454</PostalCode> 
    </Person> 
</PersonList> 
XML; 

$doc = new DOMDocument(); 
$doc->loadXML($content); 
$xp = new DOMXPath($doc); 
$nodeList = $xp->query('/PersonList/Person[./Name="Jasmin"]/*'); 
for($i = 0; $i < $nodeList->length; $i++) { 
    switch ($nodeList->item($i)->nodeName) { 
     case 'Age': 
      $nodeList->item($i)->nodeValue = 33; 
      break; 
     case 'Gender': 
      $nodeList->item($i)->nodeValue = 'F'; 
      break; 
    } 
} 
$doc->formatOutput = true; 
echo $doc->saveXML(); 

http://3v4l.org/kqjoj