2016-06-02 3 views
2

나는 다음과 같은 XML의 '기준'노드에서 '필드'요소에 액세스하려고 :XML 노드에 @attributes에 액세스 할 수 없음

<?xml version="1.0" encoding="utf-8"?> 
<result> 
    <product> 
     <data> 
      <field>spr_tech1</field> 
      <value>S7</value> 
      <criteria field="xfield_3"> 
       <criteria_list>Green</criteria_list> 
       <criteria_list>Beige</criteria_list> 
      </criteria> 
     </data> 
     <data> 
      <field>spr_tech1</field> 
      <value>S1</value> 
      <criteria field="xfield_3"> 
       <criteria_list>Red</criteria_list> 
       <criteria_list>Blue</criteria_list> 
       <criteria_list>Yellow</criteria_list> 
      </criteria> 
     </data> 
     <data> 
      <field>spr_tech1</field> 
      <value>S7</value> 
      <criteria field="xfield_3"> 
       <criteria_list>Green</criteria_list> 
      </criteria> 
      <criteria field="tech_rt2"> 
       <criteria_list>Transistor</criteria_list> 
      </criteria> 
     </data> 
    </product> 
</result> 

다음과 같은 오류가 발생합니다 아래 코드 : 치명적인 오류 : 당신이 코드에서 볼 수 있듯이 나는 몇 가지 방법을 시도했습니다 개체가 아닌

function parseXmlFile($filename) 
{ 
    $xml = file_get_contents($filename); 
    $obj = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA); 
    $array = json_decode(json_encode($obj), true); // Convert to array} 
    return $array; 
} 

$xform = parseXmlFile('transformations.xml'); 
foreach ($xform['product']['data'] as $data) 
{ 
    echo (string)$data['field'] . '<br>'; 
    echo (string)$data['value'] . '<br>'; 

    foreach($data['criteria']->attributes() as $att => $val) 
    { echo $att . ' = ' . $val . '<br>'; } 
    echo $data['criteria']->attributes()->{'field'} . '<br>'; 

    foreach($data['criteria']['criteria_list'] as $att => $val) 
    { echo $att . ' = ' . $val . '<br>'; } 

    echo "-----------------------------------<br>"; 
} 

print "<pre>"; 
print_r($xform); 
print "</pre>"; 

에() 멤버 함수 속성에 전화,하지만 어느 날 위해 노력하고 있습니다.

도움을 주시면 감사하겠습니다.

답변

1

파일을로드 할 때 문제가있는 것 같습니다. 나는 완전히 대체 할 수

$xml_content = file_get_contents('path to your XML file'); 
$xform = simplexml_load_string($xml_content); 

foreach ($xform['product']['data'] as $data) 
{ 
    echo (string)$data['field'] . '<br>'; 
    echo (string)$data['value'] . '<br>'; 

    foreach($data['criteria']->attributes() as $att => $val) 
    { echo $att . ' = ' . $val . '<br>'; } 
    echo $data['criteria']->attributes()->{'field'} . '<br>'; 

    foreach($data['criteria']['criteria_list'] as $att => $val) 
    { echo $att . ' = ' . $val . '<br>'; } 

    echo "-----------------------------------<br>"; 
} 

print "<pre>"; 
print_r($xform); 
print "</pre>"; 
+0

죄송합니다, 나는 완전히 내 XML 도우미 기능에 대해 잊어 버렸습니다. 코드에 추가했습니다. – Dizzy49

+0

두 줄의 코드를 사용하고 [field]에서 -> fields로 변경하면 모두 작동합니다. 따라서 문제는 json de/encode를 사용하여 배열로 변환 된 후입니다. – Dizzy49

1

귀하의 parseXmlFile 기능 아래 참조 file_get_contents()와 그것을 시도 내장 simplexml_load_file() :

  • 그것이 file_get_contents 처음으로 내용을로드; simplexml_load_filesimplexml_load_string은이 작업을 수행합니다
  • LIBXML_NO_CDATA 옵션이 필요합니다. 이는 거의 필요한 사항이 아닙니다. SimpleXML을 개체의 텍스트 내용을 얻을 수 있습니다 -을 포함 CDATA을 - 당신이
  • 는 데이터의 절반을 누락됩니다 배열에 매우 유용 SimpleXML을 객체로 변환하고 훨씬 더가

작업을 (string)$node를 사용 SimpleXML에 대해 이해하려면 the examples in the manual을 확인하십시오. 요소는 ->name으로 액세스하고 속성은 ['name']으로 액세스합니다.

그래서 :

$xform = simplexml_load_file('transformations.xml'); 
foreach ($xform->product->data as $data) 
{ 
    echo (string)$data->field . '<br>'; 
    echo (string)$data->value . '<br>'; 

    foreach($data->criteria->attributes() as $att => $val) 
    { echo $att . ' = ' . $val . '<br>'; } 

    echo $data->criteria['field'] . '<br>'; 

    foreach($data->criteria->criteria_list as $number => $node) 
    { echo $number . ' = ' . (string)$node . '<br>'; } 

    echo "-----------------------------------<br>"; 
}