2016-06-02 17 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

私はあなたの上の2行のコードを使用し、[フィールド]から - >フィールドにすべてを変更する場合、それは動作します。したがって、問題は、json de/encodeを使用して配列に変換された後です。 – Dizzy49

1

あなたparseXmlFile機能下記参照file_get_contents()でそれを試してみましたビルトインsimplexml_load_file()

  • はそれがfile_get_contents最初に内容をロードします。 simplexml_load_file vs simplexml_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>"; 
    } 
    
  • 関連する問題