2010-12-22 19 views
5

¿Cómo utilizar el archivo de actualización Xpath (php)? Mi estructura de archivos:actualización de archivos xml con 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> 

y necesito cambiar los valores de Edad y sexo, donde nombre es "Jasmin". Trato de usar Google, pero nada bueno No se han encontrado :(

Respuesta

5

Usted puede intentar 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

Cómo usar Xpath uso (php) actualizar archivo?

XPath es un lenguaje de consulta para documentos XML. Como tal, solo una expresión XPath no puede modificar un documento XML, solo puede seleccionar nodos u otros datos del mismo.

Un documento XML modificado puede ser producido con la ayuda del lenguaje de programación que aloja el motor de XPath - esto puede ser XSLT, C#, Java, PHP, ...

y necesito cambie los valores Age y Género donde el nombre es "Jasmin".

Aquí es una simple transformación XSLT que produce un nuevo documento XML de acuerdo con estos requisitos:

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

cuando se aplica esta transformación en el documento XML proporcionado:

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

el resultado deseado, correcto se produce:

<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

Puede usar DOMDocument desde PHP.

Cargue su archivo y luego bucle a través de los nodos secundarios del documento.

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

Puede guardar su salida XML como esto

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

Para ello el análisis sintáctico en JavaScript que puedes usar jQuery (una pequeña, pero poderosa biblioteca).

Puede incluir la biblioteca directamente desde el Repositorio de Código de Google.

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

La biblioteca es de navegador cruzado y muy pequeña. Debería almacenarse en caché en muchos casos, porque algunos sitios lo usan de 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

Lo sé, llego tarde.Aquí es una solución basada en pura 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