Как сохранить файл XML на веб-сервере с помощью PHP? - PullRequest
2 голосов
/ 28 июля 2010

Я новичок в PHP и ничего не знаю о манипуляциях с XML. Я работаю над XML-аннотацией Google CSE, показанной ниже:

  <?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->save("test.xml");? Как сохранить файл XML на сервере?

Ответы [ 2 ]

3 голосов
/ 04 августа 2010

Я не вижу ничего плохого в вашем коде. Я думаю, у вас есть проблема с разрешением.

PHP работает как один из следующих двух пользователей:

  • nobody или, возможно, www-data (он же системный пользователь, используемый веб-сервером)
  • Ваше имя пользователя

Чтобы PHP запускался как пользователь, владеющий веб-корнем (т. Е. Вы), suexec должен быть включен для PHP. Тот факт, что вы не можете записать в файл с разрешениями 0644, говорит о том, что это не так.

У вас есть два варианта:

  • Переконфигурируйте сервер, чтобы PHP работал как пользователь, владеющий веб-корнем
  • Сделать мир файлов доступным для записи

Я настоятельно рекомендую первое, а не второе. Однако у вас не всегда есть такой выбор. Если ваш хост (или системный администратор, или кто-то еще) не может или не включит suexec для PHP, вам нужно предоставить файлу 0777 права доступа, или rwxrwxrwx.

Возможно, вы захотите войти через ssh и сначала создать выходной файл, используя команду touch (или каталог, если это то, что вам нужно через mkdir), а затем предоставьте ему необходимые разрешения.

3 голосов
/ 02 августа 2010

С $dom->save("test.xml");.
все в порядке. Вам не нужно делать сохранение с DOM, хотя. С таким же успехом можно сделать это с SimpleXML:

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

Убедитесь, что папка назначения доступна для записи. Используйте абсолютный путь, чтобы убедиться, что вы действительно ищете файл в нужном месте.

...