【问题标题】:How to save an XML file on the web server using PHP?如何使用 PHP 在 Web 服务器上保存 XML 文件?
【发布时间】:2010-07-28 09:46:41
【问题描述】:

我是 PHP 的初学者,我对 XML 操作一无所知。我正在研究如下所示的 Google CSE 注释 XML:

  <?xml version="1.0" encoding="UTF-8" ?> 
- <Annotations>
- <Annotation about="http://sanspace.in/">
  <Label name="_cse_byxamvbyjpc" /> 
  </Annotation>
- <Annotation about="http://blog.sanspace.in/">
  <Label name="_cse_byxamvbyjpc" /> 
  </Annotation>
- <Annotation about="http://google.com/">
  <Label name="_cse_exclude_byxamvbyjpc" /> 
  </Annotation>
  </Annotations>

我想从上面显示的文件中实现这一点:

  <?xml version="1.0" encoding="UTF-8" ?> 
- <Annotations>
- <Annotation about="http://sanspace.in/">
  <Label name="testString1" /> 
  </Annotation>
- <Annotation about="http://blog.sanspace.in/">
  <Label name="testString2" /> 
  </Annotation>
- <Annotation about="http://google.com/">
  <Label name="testString2" /> 
  </Annotation>
  </Annotations>

到目前为止,我已经尝试过:

<?php
if (file_exists('test.xml'))
  {
  $xml = simplexml_load_file('test.xml');
  }
else
  {
  exit('Error.');
  }
foreach($xml->Annotation as $annotation)
    {
    if ($annotation["about"]=="http://sanspace.in/") 
        {  $annotation->Label["name"]="testString1";  } 
    else 
        {  $annotation->Label["name"]="testString2";  } } 

$dom = new DOMDocument('1.0'); 
$dom->preserveWhiteSpace = false; 
$dom->formatOutput = true; 
$dom->loadXML($xml->asXML()); 
echo $dom->saveXML();
$dom->save("test.xml");
?> 

此代码执行任务,但不会将其保存到文件中。

我的问题是,$dom-&gt;save("test.xml"); 语句有什么问题? 如何在服务器上保存 XML 文件?

【问题讨论】:

  • @Gordon,编辑了问题。
  • @San 除了第二个 if 语句中缺少括号外,它是否有效?有什么错误吗?
  • @Gordon,我添加了括号。没有变化。当我通过浏览器调用这个文件时,我只是得到一个空白页。 test.xml 文件位于此 php 页面所在的同一目录中。我做错什么了吗?
  • @San 查看页面的源代码。也是空白吗?如果是这样,请启用 error_reporting(-1); 并确保您的 php.ini 启用了 display_errorsdisplay_startup_errors。然后重新加载页面,看看它是否有任何错误。
  • @Gordon 它是空白的。但是,除了该文件上的 php 代码外,什么都没有。因此,即使它工作正常,它也会是空白的。那正确吗?我明白你关于错误的观点。但是,我不知道我在哪里启用错误报告以及 php.ini 的位置。我使用 cPanel 和 PHP5(我希望)。

标签: php xml simplexml


【解决方案1】:

我认为您的代码没有任何问题。我认为您有权限问题。

PHP 作为以下两个用户之一运行:

  • nobody 或者可能是 www-data(也就是网络服务器使用的系统用户)
  • 您的用户名

为了让 PHP 以拥有 Web 根目录的用户(即您)身份运行,必须为 PHP 启用 suexec。您无法写入具有0644 权限的文件这一事实几乎说明它不是。

你有两个选择:

  • 重新配置服务器,以便 PHP 以拥有 Web 根目录的用户身份运行
  • 使文件世界可写

我强烈推荐第一个而不是第二个。但是,您并不总是有这样的选择。如果您的主机(或系统管理员或其他任何人)不能或不会为 PHP 启用 suexec,则您必须授予文件 0777 权限,也就是 rwxrwxrwx

您可能希望通过 ssh 登录并首先使用 touch 命令(或目录,如果您需要通过 mkdir 创建输出文件),然后为其授予所需的权限。

【讨论】:

  • Tim,我不知道如何配置suexec。会努力的。如果我有777可以吗?这是否意味着缺乏安全性?
【解决方案2】:

$dom-&gt;save("test.xml"); 没有错。
不过,您不需要使用 DOM 进行保存。也可以使用 SimpleXML:

$xml->saveXML("test.xml");

确保目标文件夹是可写的。使用绝对路径确保您实际上是在正确的位置查找文件。

【讨论】:

  • 我试过了。但是,没有效果。 XML 权限是rw-r--r--。可以吗?
  • @San 如果网络服务器是文件的所有者,是的。如果没有将组权限也设置为w。如果网络服务器既不是所有者,也不在文件所有者的组中,chmod 是网络服务器的所有者。
  • 戈登,我尝试了第一个,但没有成功。不知道怎么改楼主。据我了解,问题不在于代码。这只是我缺乏如何在服务器上编辑文件的知识。非常感谢您一直以来的支持。
  • @San 如果文件不可写,应该会有错误。我很确定你只是忽略了一些东西。
  • Gordon,终于把文件权限改成777搞定了。感谢一直以来的支持。在每个阶段都非常非常有帮助。
猜你喜欢
  • 1970-01-01
  • 2017-07-17
  • 2014-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-21
  • 2016-10-08
相关资源
最近更新 更多