2010-12-22 20 views
5

Xpath(php)アップデートファイルを使用するには? 私のファイル構造:xmlファイルを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> 

と私は変更は名前が「ジャスミン」で年齢と性別値が必要です。私はGoogleのを使用しようとしませんが、良いものは何も見つからなかった:(

答えて

5

あなたはsimplexml

ファイルを更新使用のXpath(PHP)を使用する方法
$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がありますXMLドキュメントのクエリ言語です。したがって、XPath式だけがXMLドキュメントを変更することはできません。ノードやその他のデータはノードから選択することができます

このかもしれXSLT、C#、Java(登録商標)、PHP、...

を、私は必要 -

Aは XPathエンジンをホストしているプログラミング言語の助けを借りて製造することができるXMLドキュメントを修正しました値を変更する年齢と 名前が「ジャスミン」の性別。ここで

は、これらの要件に応じて新しいXMLドキュメントを作成する簡単なXSLT変換である:

<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> 
:この変換が提供されるXML文書に適用され

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

希望の正しい結果が得られます

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

あなたはjQueryの(小さな、しかし、強力なライブラリ)を使用してくださいJavaScriptでこの解析を行うために、この

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

のようなあなたの出力XMLを保存することができます。

Googleコードリポジトリから直接ライブラリを含めることができます。

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

ライブラリはブラウザ間で非常に小さいです。一部のサイトでGoogleコードから使用するサイトがあるため、多くの場合キャッシュされるはずです

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

関連する問題