我在一个目录中有两个.plist文件,它们都如下所示:
<dict>
<key>bundle-identifier</key>
<string>TEXT</string>
<key>bundle-version</key>
<string>VESRION</string>
<key>kind</key>
<string>software</string>
<key>subtitle</key>
<string>TEXT</string>
<key>title</key>
<string>TEXT</string>
</dict>我能够获得标题的值/字符串,如下所示:
$files = array();
foreach (glob("../../plists/*.plist") as $file) {
$files[] = $file;
//echo "$file";
$fileContent = file_get_contents($file);
$xml = simplexml_load_string($fileContent) or die("Error: Cannot create object");
$resultNames = $xml->dict->array->dict->dict->string[4] . '<br /> <br />';
//echo $resultNames;
}现在,我想用php来更改每个标题的值/字符串,就像如果我更改其中一个的标题值/字符串,我不希望另一个受到它的影响,有可能吗?
发布于 2019-12-27 20:10:50
不确定标题的回声是如何工作的,但在这段代码中,我使用XPath查找具有内容title的<key>元素。然后,它获取以下<string>元素的值。
要更新它,您可以在SimpleXML中使用一些模糊操作,使其设置<string>元素的值,然后将结果XML保存回相同的文件名.
$xml = simplexml_load_string($fileContent) or die("Error: Cannot create object");
// Find the correct string element from the preceding key for title
$titleString = $xml->xpath('//key[.="title"]/following-sibling::string')[0];
// Set new value
$titleString[0] = "new Title1";
// Save the file
$xml->asXML($file);如果您通过文件名标识内容,那么检查$file,但是如果您只能通过标题来标识它,那么您需要检查它是否找到了您想要的标题。
$titleToUpdate = "Correct Title2";
$fileContent = file_get_contents($file);
$xml = simplexml_load_string($fileContent) or die("Error: Cannot create object");
$titleString = $xml->xpath('//key[.="title"]/following-sibling::string[.="'.$titleToUpdate.'"]');
// Check there is 1 matching item
if ( count($titleString) == 1 ) {
$titleString[0][0] = "new Title12";
$xml->asXML($file);
}发布于 2019-12-27 20:02:51
我不确定什么都能理解,但是您可以使用DomDocument来更改值。
$doc = new DOMDocument;
$doc->load('your_xml_file.xml');
$elements = $doc->getElementsByTagName("string");
foreach ($elements as $element) {
//$element->nodeName will be "string"
$nodes = $element->childNodes;
foreach ($nodes as $node) {
$node->nodeValue = 'New value';
}
}
$doc->save("newfile.xml")发布于 2019-12-27 20:16:05
它不漂亮,但很管用。
$doc = new DOMDocument;
$doc->load('file_address');
$elements = $doc->documentElement;
$found = false;
foreach ($elements->childNodes AS $item) {
if($found){
$item->nodeValue = 'changed';
$found = false;
}else{
if($item->nodeName == 'key' && $item->nodeValue == 'title'){
$found = true;
}
}
}
$doc->saveXML();https://stackoverflow.com/questions/59505201
复制相似问题