2017-03-03 9 views
0

私はPHP XPathを使用してXMLデータを読んでいます。私は単一のXpathで以下のようにアドレスの牽制線を読むことができますか?単一のPHP XPathで2つのサブノードを読む

<Address> 
<FirstLine>Indiabulls Finance Centre Tower</FirstLine> 
<SecondLine>Elphinstone Road</SecondLine> 
</Address> 

現在、私は別々のXPathとしてそれらを読んでいます

$xml->xpath('//Address/FirstLine'); 
$xml->xpath('//Address/SecondLine'); 

答えて

1

だけAddressのいずれかの子に一致するように、ワイルドカード"*"を使用します。

//Address/* 

また、あなたが

string-join(//Address/*, " ") 
を試すことができます

両方の値を1つの文字列として取得する"Indiabulls Finance Centre Tower Elphinstone Road"

+0

私は$ XML->文字列に参加しようとしたように( "// CDT:アドレス/ *"、 "「);しかし、エラーjoin()を示しています:無効な引数が渡されました – hrishi

+0

いいえ、 '$ xml-> xpath( 'string-join(// Address/*、")'); ' – Andersson

+0

SimpleXMLElement :: xpath():xmlXPathCompOpEval :関数string-concatが見つかりません – hrishi

0

複数のノードをフェッチするためにXpathを使用できます。

  • は、二つの別の場所パス/式 /Address/FirstLine|/Address/SecondLine
  • 任意のアドレスの子要素ノードをフェッチ /Address/*
  • を組み合わせた文字列を取得し、任意のアドレスの子要素ノードを取得し、それらに /Address/*[self::FirstLine or self::SecondLine]

をフィルタリング組み合わせSimpleXMLではなくDOMに直接アクセスすることはできません。 SimpleXMLElement::xpath()は、ノードの配列(SimpleXMLElementオブジェクトで表される)だけを返すことができます。 DOMXpath::evaluate()はスカラーを返すことができます。

$xml = '<Address> 
<FirstLine>Indiabulls Finance Centre Tower</FirstLine> 
<SecondLine>Elphinstone Road</SecondLine> 
</Address>'; 

$document = new DOMDocument(); 
$document->loadXml($xml); 
$xpath = new DOMXpath($document); 
$result = $xpath->evaluate("concat(/Address/FirstLine, '\n', /Address/SecondLine)"); 

var_dump($result); 

出力:

string(48) "Indiabulls Finance Centre Tower 
Elphinstone Road" 
関連する問題