2015-05-08 6 views
1

Я пытаюсь создать скрипт PHP для получения значений из string.xml android. Извлечение XML-файла из файла, а затем синтаксический анализ XML - один из способов.xml parser php attribute

Это string.xml файл:

<?xml version="1.0" encoding="utf-8"?> <resources> 
    <string name="btn_search">Search</string> 
    <string name="btn_around">Around</string> 
    <string name="btn_load">Load more</string> 
    <string name="btn_load_more">Load More</string> 
    <string name="loading">Loading</string> 
    <string name="title_activity_main">MainActivity</string> 
    <string name="title_activity_pharmacy">Pharmacies</string> 
    <string name="title_activity_around">AroundActivity</string> 
    <string name="gps_network_enabled">GPS or Network is not enabled</string> 
    <string name="action_settings">Settings</string> 
    <string-array name="fi"> 
     <item>A</item> 
     <item>Almak</item> 
     <item>Anlamak</item> 
     <item>Anlasmak</item> 
     <item>Anlatmak</item> 
     <item>Ayrilmak</item> 
    </string-array> </resources> 

И это мой простой сценарий:

$xml = simplexml_load_file(XML_UPLOAD_PATH . $file_name); 
    var_dump($xml); 

Туз rezult является:

object(SimpleXMLElement)[1] 
    public 'string' => 
    array (size=2) 
     0 => string 'Search' (length=6) 
     1 => string 'Around' (length=6) 
    public 'string-array' => 
    object(SimpleXMLElement)[2] 
     public '@attributes' => 
     array (size=1) 
      'name' => string 'fi' (length=2) 
     public 'item' => 
     array (size=2) 
      0 => string 'A' (length=1) 
      1 => string 'Almak' (length=5) 

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

ответ

0

Если вы хотите получить доступ атрибутов см этот пример XML разбора (любезно Руководство по PHP) -

$string = <<<XML 
<a> 
<foo name="one" game="lonely">1</foo> 
</a> 
XML; 

$xml = simplexml_load_string($string); 
foreach($xml->foo[0]->attributes() as $a => $b) { 
    echo $a,'="',$b,"\"\n"; 
} 

Если вы хотите, чтобы преобразовать ваш пример в массив, вы можете сделать следующее -

$xml = simplexml_load_string($string, XML_UPLOAD_PATH . $file_name, LIBXML_NOCDATA); 

$array = json_decode(json_encode((array)$xml), TRUE); 
0

Я тоже пытался найти способ чтения файла strings.xml через PHP. Когда я использовал simplexml_load_file, все атрибуты исчезли по какой-то причине? Я выяснил, что тег <resources> вызывал проблему, и если бы я использовал simplexml_load_string только на теге <string>, тогда все было бы хорошо.

Я сделал эту функцию, чтобы разбить каждую строку, так что я мог бы назвать simplexml_load_file по каждому <string> тегу:

parse_xml(' 
    <resources> 
    <string name="app_name" translatable="false">My App</string> 
    <string name="string_name_example">Some text</string> 
    </resources> 
'); 

function parse_xml($xml_file_contents = '') { 
    // remove whitespace and return carriages in between tags 
    $xml_file_contents = preg_replace("#\>((\n|\r)\s+)\<#","><",$xml_file_contents); 
    // remove any left over return carriages and tabs 
    $xml_file_contents = preg_replace("#\n|\r|\t#","",$xml_file_contents); 
    // remove comments 
    $xml_file_contents = preg_replace("#\<\!\-(.*?)\-\>#","",$xml_file_contents); 
    // explode the data 
    $xml_explode = explode('><',$xml_file_contents); 
    $xml_data = []; 
    foreach ($xml_explode as &$line) { 
     $line = trim($line); 
     $line = preg_replace('#^\<|\>$#','',$line); 
     $line = sprintf("<%s>",$line); 
     if (preg_match('#\>.*?\<#',$line,$matches)) { 
      // valid 
      $xml_data[] = json_decode(json_encode(simplexml_load_string($line)),true); 
     } 
    } 
    return $xml_data; 
} 

Это похоже на работу для меня и производит следующий вывод

Array 
(
    [0] => Array 
     (
      [@attributes] => Array 
       (
        [name] => app_name 
        [translatable] => false 
       ) 

      [0] => My App 
     ) 

    [1] => Array 
     (
      [@attributes] => Array 
       (
        [name] => string_name_example 
       ) 

      [0] => Some text 
     ) 

) 

В зависимости от размер данных xml, функция взрыва может повысить уровень использования памяти, поэтому будьте в курсе!