2010-12-22 13 views
5

Jak korzystać z pliku aktualizacji Xpath (php)? Moja struktura pliku:zaktualizuj plik xml za pomocą php Xpath

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

I muszę zmienić wartości Wiek i Płeć gdzie nazwa to „Jasmin”. Próbuję użyć google, ale nic dobrego nie znaleziono :(

Odpowiedz

5

Można spróbować 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

Jak chcesz używać XPath (PHP) Aktualizacja plik?

XPath jest język zapytań dla dokumentów XML Jako taki, tylko wyrażenie XPath nie może modyfikować dokumentu XML - może tylko wybrać węzły lub inne dane z niego.

Zmodyfikowany dokument XML może być wytwarzany za pomocą języka programowania, który obsługuje silnik XPath - może to być XSLT, C#, Java, PHP, ...

I muszę zmień wartości Wiek i Płeć, gdzie jest "Jasmin".

Oto prosta transformacja XSLT, który wytwarza nowy dokument XML zgodnie z tymi wymaganiami:

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

kiedy ta transformacja jest stosowane na dostarczonym dokumencie 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> 

pożądany, prawidłowy wynik jest produkowany:

<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

Możesz użyć DOMDocument z PHP.

Załadujesz plik, a następnie przechodzisz przez pętlę childNodes do dokumentu.

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

można zapisać dane wyjściowe XML jak ten

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

Aby to zrobić podczas analizowania w JavaScript należy użyć jQuery (małe, ale potężne biblioteki).

Możesz dołączyć bibliotekę bezpośrednio z repozytorium kodów Google.

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

Biblioteka jest przeglądarka i bardzo mała. W wielu przypadkach należy go zbuforować, ponieważ niektóre witryny używają go od Google Code

$(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

Wiem, jestem spóźniony.Tutaj jest rozwiązanie oparte na czystej 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