2016-07-17 8 views
1

をロードしないように根本的な原因xmlファイルの属性、これは解決された私の前の質問へのフォローアップの質問ですが、ここではそれへのリンクがあります:解決するための@RomanPerekhrestへ using data from child element to select data in other element using simplexml in phpだから、SimpleXMLはPHPで

感謝この。

私は、これを考え出すため@RomanPerekhrestのおかげで、私のxmlファイルを再度

<?php 



    $xml = simplexml_load_file('../uploads/reports/report.xml'); 

$hits = $xml->xpath("results/hits/@rule_id"); 
$ruleIds = array_map(function($v){ // getting search path for each needed rule 
    return "profile_info/rules/rule[@id='". (string)$v. "']"; 
}, $hits); 

foreach ($xml->xpath(implode(" | ", $ruleIds)) as $rule) { 
    echo '<div id="name">'. $rule->display_name .'</div>'. 
     '<div id="comment">'. $rule->display_comment .'</div>'; 
}           
?> 

を読み取るためのSimpleXMLを使用してPHPコードのこの部分を持っています。

このコードは私の以前の質問の問題を説明するために作成した簡略化されたxmlファイルでうまく動作しますが、適用するとレンダリングされません。

私のルート要素にxmlns属性があり、xmlが読み込まれないという理由が見つかりました。これらの属性を手動で削除すると、すべて正常に動作します。 (私は、リスト全体をXML文書ではないでしょう、それは8500+行長いので) ここでは属性を持つルート要素です:

<report xsi:schemaLocation="http://www.callassoftware.com/namespace/pi4 pi4_results_schema.xsd" xmlns="http://www.callassoftware.com/namespace/pi4" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 

私はPHPでバイパスする方法が必要です。これらのXMLファイルは他のソフトウェアによって生成され、この世代では設定が不足しているので、これらの属性を持たないXMLファイルを作成することはできません。

おかげ

+0

addreses: 'http://www.callassoftware.com/namespace/pi4 pi4_results_schema.xsd'と' http:// www.callassoftware.com/namespace/pi4'は無効で、 'Not found'を返します。私が気づいたのは – RomanPerekhrest

+0

ですaswel、それは私のXML全体を読むことに失敗している、私はこの問題にアプローチする方法は本当にわからない –

+0

@RomanPerekhrest名前空間識別子は実際にどこでも解決する必要はありません。同じ名前を使用している人をすべて停止させる方法と同じようにURIです。 – IMSoP

答えて

3

あなたのXMLは、接頭辞を継承せずにルート要素で宣言既定の名前空間子孫要素を持つ暗黙的に

xmlns="http://www.callassoftware.com/namespace/pi4" 

デフォルトの名前空間の要素を参照するためには、あなたがマップする必要がありますデフォルトの名前空間URIの接頭辞を使用し、その接頭辞をXPathで使用します。

//register prefix 'd' to reference default namespace URI 
$xml->registerXPathNamespace('d', 'http://www.callassoftware.com/namespace/pi4'); 

//use the prefix to reference elements in the default namespace 
$hits = $xml->xpath("d:results/d:hits/@rule_id"); 
$ruleIds = array_map(function($v){ // getting search path for each needed rule 
    return "d:profile_info/d:rules/d:rule[@id='". (string)$v. "']"; 
}, $hits); 
+0

これはうまくいきました。 –