2013-11-23 3 views
0

simplephp를 사용하여 XML 파일을 반복하고 싶습니다.특수 조건이있는 xml 구문 분석 루프

에 액세스하기위한 내 코드는 다음과 같은 것입니다 : 일부 데이터가 민감하지만 기본적를 같이이 XML에있는 모든 항목 이름의 이름을 메아리

// get the path of the file 
$file = "xml/".$item_name . "_cfg.xml"; 

if(! $xml = simplexml_load_file($file)){ 
    echo 'unable to load XML file'; 
} else { 

$item_array = array(); 
foreach($xml->config->exported->item as $items) 
    { 
$item_name = (string) $items->attributes()->name; 
echo "item name: " . $item_name . "<br />"; 
} 
, 이것은 실제 XML 밤은 다른 데이터와 동일합니다.

따라서는 아래의 XML을 기반으로 다음과 같이 표시됩니다 :

yellow 
blue 
-------- 
orange 
red 
-------- 
black 
: 좋은하지만 내가 표시해야하는 것은 여기

yellow 
blue 
orange 
red 
black 

되는 XML

<?xml version="1.0"?> 
<main> 
    <config> 
     <exported> 
      <items> 
       <item name="yellow"></item> 
       <item name="blue"></item> 
       <New_Line /> 
       <item name="orange"></item> 
       <item name="red"></item> 
       <New_Line /> 
       <item name="black"></item> 
      </items> 
     </exported> 
    </config> 
<main> 

xml에 표시되는 경우 일부 통계 사이에이 줄이 있습니다.

,
<New_Line /> 

그리고 난 내가 몇 대시 에코 할 것인지가 발생하지만 난 내가 SimpleXML을 잘 알고 아니에요 당신이 그것을 어떻게 정말 확실하지 않다 때

답변

1

틀림없이이 구조의 가난한 선택은에 아마도 실제 의미하는 것은 item의 여러 세트가 있기 때문에 각 개별 그룹을 나타내는 부모가 있어야한다는 것입니다. 그럼에도 불구하고 SimpleXML을 사용하면 쉽게 할 수 있습니다.

트릭은 use the ->children() method으로 모든 자식 노드에 대해 이름에 관계없이 순서대로 반복합니다. 그 루프 내에서 examine the name of each node using ->getName()을 수행하고 행동 방법을 결정할 수 있습니다.

다음은 예 (및 a live demo of it in action)입니다. 내가 제공 한 샘플 XML과 일치하도록 ->items을 추가했으며 $node->attributes()->name이 아닌 $node['name']을 사용했습니다.

foreach($xml->config->exported->items->children() as $node) 
{ 
    switch ($node->getName()) 
    { 
     case 'item': 
      $item_name = (string)$node['name']; 
      echo "item name: " . $item_name . "<br />"; 
     break; 
     case 'New_Line': 
      echo '<hr />'; 
     break; 
    } 
} 
관련 문제