2016-11-22 5 views
0

別の質問が掲載されましたが、私のエラーは不完全でした。 私は複数の名前空間を持つXMLを持っていますが、foreach内の値にアクセスする必要があります。PHPで複数の名前空間を持つXMLコンテンツから値の配列を取得する

私のXML列がある:私が別のユーザーによって助けられた

<ArrayOfSession xmlns:i='http://www.w3.org/2001/XMLSchema-instance' xmlns='http://schemas.datacontract.org/2004/07/Vista.Online.BackOffice.Api.Models.V1'> 
<Session> 
    <AreComplimentariesAllowed>true</AreComplimentariesAllowed> 
    <Attributes xmlns:d3p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays"> 
    <d3p1:string>0000000009</d3p1:string> 
    <d3p1:string>0000000011</d3p1:string> 
    </Attributes> 
</Session> 
</ArrayOfSession> 

:その答えをRetrieving an array of values from an XML content with a namespace in PHP

私はいくつかのバリエーションを試してみました。これは動作していない私の現在の1、であること:

$xml->registerXPathNamespace('i', 'http://www.w3.org/2001/XMLSchema-instance'); 
$xml->registerXPathNamespace('j', 'http://schemas.datacontract.org/2004/07/Vista.Online.BackOffice.Api.Models.V1'); 
$xml->registerXPathNamespace('ns', 'http://schemas.microsoft.com/2003/10/Serialization/Arrays'); 

foreach($xml->xpath('//ns:d3p1') as $header){ 
    var_export($header->xpath('//Attributes/ns:string')); 
} 

私も試してみました:

foreach($xml->xpath('//ns:d3p1') as $header){ 
     var_export($header->xpath('//ns:string')); 
    } 

これは私を遊説されます!

コードの残りのための私の現在の作業バージョンでは、私は要素を取得しています:

foreach($xml->Session as $event){ 
    // Do Something with $event->AreComplimentariesAllowed 
} 

これは正常に動作しますが、私はちょうどそれらの属性の要素にアクセスすることはできません。

ありがとうございます。

答えて

0

xpath()に電話する前に、各SimpleXMLElementに名前空間を登録する必要があります。あなたは$xml変数に登録しますが、$headerには登録しません。

XMLにはデフォルトの名前空間もあります。プレフィックスjを登録しますが、プレフィックスは使用しません。最後にここに要素はありませんd3p1です。これは、ドキュメント内の名前空間接頭辞です。だから、これは違って見えるDOMでAttributes

$sessions = new SimpleXMLElement($xml); 
$sessions->registerXPathNamespace(
    'j', 
    'http://schemas.datacontract.org/2004/07/Vista.Online.BackOffice.Api.Models.V1' 
); 

foreach($sessions->xpath('//j:Session') as $session) { 
    $session->registerXPathNamespace(
    'j', 
    'http://schemas.datacontract.org/2004/07/Vista.Online.BackOffice.Api.Models.V1' 
); 
    $session->registerXPathNamespace(
    'ns', 
    'http://schemas.microsoft.com/2003/10/Serialization/Arrays' 
); 
    var_export($session->xpath('.//j:Attributes/ns:string')); 
} 

Session要素、その後string値を反復処理する

$document = new DOMDocument(); 
$document->loadXml($xml); 
$xpath = new DOMXpath($document); 
$xpath->registerNamespace(
    'j', 
    'http://schemas.datacontract.org/2004/07/Vista.Online.BackOffice.Api.Models.V1' 
); 
$xpath->registerNamespace(
    'ns', 
    'http://schemas.microsoft.com/2003/10/Serialization/Arrays' 
); 

foreach ($xpath->evaluate('//j:Session') as $session) { 
    var_export(
    iterator_to_array($xpath->evaluate('.//j:Attributes/ns:string', $session)) 
); 
} 

それは、専用のXpathオブジェクトを持っているので、名前空間の登録があり一度だけ行うこと。

+0

ありがとうございました。私はまだ少し混乱している。これが最初に登録されていませんか? '$ xml-> registerXPathNamespace( 'i'、 'http://www.w3.org/2001/XMLSchema-instance'); $ xml-> registerXPathNamespace( 'j'、 'http://schemas.datacontract.org/2004/07/Vista.Online.BackOffice.Api.Models.V1'); $ xml-> registerXPathNamespace( 'ns'、 'http://schemas.microsoft.com/2003/10/Serialization/Arrays'); ' – David

+0

'$ xml'変数で表されるSimpleXMLElementでのみ呼び出されますが、 $ header変数のメソッドSimpleXMLでは、各変数に何度も名前空間を登録する必要があります。ここに例があります:http://stackoverflow.com/a/29556930/2265374 – ThW

+0

ありがとう。私は関係を見ることができますが、一緒にそれを作ることはできません:https://eval.in/683080 – David

関連する問題