首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用PHP替换xml/plist文件中的字符串

使用PHP替换xml/plist文件中的字符串
EN

Stack Overflow用户
提问于 2019-12-27 19:24:36
回答 4查看 311关注 0票数 0

我在一个目录中有两个.plist文件,它们都如下所示:

代码语言:javascript
复制
<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>

我能够获得标题的值/字符串,如下所示:

代码语言:javascript
复制
$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来更改每个标题的值/字符串,就像如果我更改其中一个的标题值/字符串,我不希望另一个受到它的影响,有可能吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-12-27 20:10:50

不确定标题的回声是如何工作的,但在这段代码中,我使用XPath查找具有内容title<key>元素。然后,它获取以下<string>元素的值。

要更新它,您可以在SimpleXML中使用一些模糊操作,使其设置<string>元素的值,然后将结果XML保存回相同的文件名.

代码语言:javascript
复制
$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,但是如果您只能通过标题来标识它,那么您需要检查它是否找到了您想要的标题。

代码语言:javascript
复制
$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);
}
票数 2
EN

Stack Overflow用户

发布于 2019-12-27 20:02:51

我不确定什么都能理解,但是您可以使用DomDocument来更改值。

代码语言:javascript
复制
$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")
票数 0
EN

Stack Overflow用户

发布于 2019-12-27 20:16:05

它不漂亮,但很管用。

代码语言:javascript
复制
$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();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59505201

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档