2013-12-16 2 views
1

나는이처럼 보이는 XML이 :키로 속성을 유지하는 XML 파일을지도

<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 
<lang> 
    <data type="array"> 
    <languageKey index="default" type="array"> 
     <label index="name">Full Name</label> 
     <label index="sex">Gender</label> 
    </languageKey> 
    <languageKey index="es" type="array"> 
     <label index="name">Nombre Completo</label> 
     <label index="sex">Género</label> 
    </languageKey> 
    </data> 
</lang> 

을 내가 값의 키와 인덱스 속성을 유지하는 객체 또는 배열로 변환해야합니다.

예는 :

$lang = array (
    'default' => array (
    'name' => 'Full Name', 
    'sex' => 'Gender' 
), 
    'es' => array (
    'name' => 'Nombre Completo', 
    'sex' => 'Género' 
) 
); 

나는 simplexml_load_file()을 시도했지만 인덱스를 제거하고 숫자 키를 만듭니다. 나는이 기능을 개발 한 솔루션을 알아 내기 위해 노력

답변

2

나는 DomDocument을 사용하십시오. 데이터 구조는 정확히 같은 다음 주어진 것입니다 경우, 수 (가) foreach 당신이 이전 결과 내 요소를 찾을 수 있습니다 변경

$xml = <<<XML 
<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 
<lang> 
    <data type="array"> 
    <languageKey index="default" type="array"> 
     <label index="name">Full Name</label> 
     <label index="sex">Gender</label> 
    </languageKey> 
    <languageKey index="es" type="array"> 
     <label index="name">Nombre Completo</label> 
     <label index="sex">Género</label> 
    </languageKey> 
    </data> 
</lang> 
XML; 

$dom = new DOMDocument(); 
@$dom->loadXML($xml); 
$elements = $dom->getElementsByTagName('languageKey'); 
$return = array(); 
foreach($elements as $element){ 
    $tokens = explode("\n", trim($element->nodeValue)); 
    $key = $element->getAttribute('index'); 
    $return[$key] = array(
    'name' => trim($tokens[0]), 
    'sex' => trim($tokens[1]) 
); 
} 

echo '<pre>' . print_r($return, true) . '</pre>'; 

OUTPUT

Array 
(
    [default] => Array 
     (
      [name] => Full Name 
      [sex] => Gender 
     ) 

    [es] => Array 
     (
      [name] => Nombre Completo 
      [sex] => Género 
     ) 

) 

편집

:

foreach($elements as $element){ 
    $key = $element->getAttribute('index'); 
    // here we'll get label elements 
    $labels = $element->getElementsByTagname('label'); 
    foreach($labels as $label){ 
    // use index attribute as key 
    $key2 = $label->getAttribute('index'); 
    $return[$key][$key2] = trim($label->nodeValue); 
    } 
} 

더 일반적이고 쉽게 적용 할 수 있습니다.

+0

멋진 솔루션! 나는이 확장을 모른다. 확실히 그것을 검토 할 것입니다. 이 솔루션의 유일한 문제점은 인덱스 속성에 수백 가지 이름이 있기 때문에 즉시 키를 가져와야한다는 것입니다. 그러나 이러한 새로운 도구를 사용하면 그렇게 할 수있는 여러 가지 방법이 있어야한다고 생각합니다. 고마워요! – Memochipan

+1

@Memochipan은 [xpath] (http://www.php.net/manual/en/class.domxpath.php)도 살펴 봅니다. 쉬운 옵션을 사용하는 것처럼 여기서는 사용하지 않았습니다. 'DomDocument'와 함께하면 마크 업 언어로 무엇이든 검색 할 수 있습니다. 훨씬 더 믿을만한 정규식입니다. – gwillie

+0

새로운 일반 버전으로 잘 끝났습니다. 이 새로운 접근 방식을 가져 주셔서 감사합니다. – Memochipan

0

:

// Carga un archivo XML de idioma y lo convierte en un array para su consulta. 
function loadXMLfile($file){ 

    // Carga el contenido del archivo. 
    $file_content = file_get_contents($file); 

    preg_match_all('/<languageKey(.+?)>(.+?)<\/languageKey>/is', $file_content, $lang_blocks); 

    // Obtiene las etiquetas de idioma. 
    foreach ($lang_blocks[1] as $meta_data){ 
     preg_match_all('/index="(.+?)"/is', $meta_data, $lang); 
     $langs[] = $lang[1][0]; 
    } 

    // Obtiene los textos 
    foreach ($lang_blocks[2] as $texts){ 
     preg_match_all('/<label index="(.+?)">(.+?)<\/label>/is', $texts, $label); 
     $labels[] = array_combine($label[1],$label[2]); 
    }   

    return array_combine($langs,$labels); 
} 
관련 문제