0

XMLで同じレベルにある他のノードの値を持つノードを見つけるにはどうすればよいですか? XML:

<config>
  <module>
    <idJS >001</idJS>
    <addressPLC>41000</addressPLC>
  </module>
  <module>
    <idJS >002</idJS>
    <addressPLC>42000</addressPLC>
  </module> 
</config>

PHP:

<?php
$doc = new DOMDocument();
$doc->load( 'file.xml' );
$config = $doc->getElementsByTagName( "module" );

$ids = $doc->getElementsByTagName('idJS');
foreach ($ids as $id) {
  if ($id->nodeValue == '001') {
      echo $addressPLC;
  }
}
?>

「idJS」で「addressPLC」のnodeValueを取得するにはどうすればよいですか?

4

4 に答える 4

0

親を取得し、親の要素addressPLCidJS見つけることができます。

$addressPLC = $id->parentNode->getElementsByTagName("addressPLC");
echo $addressPLC->nodeValue;
于 2013-01-09T13:38:33.403 に答える
0

PHPには、特定のノードのすべての兄弟を取得する直接的な方法はありません。を介して親要素を$node->parentNode選択してから、その親要素から開始し、既に知っている方法(例getElementsByTagName())を使用して目的の要素を選択する必要があります。

php.netのDOMドキュメントにもユーザーコメントがあります。これには、特定のノードの兄弟を見つけるための実装があります:http: //php.net/dom#60188

于 2013-01-09T13:40:11.967 に答える
0

望ましい方法は、<module>(idJS ノードではなく) ノードを反復処理し、その時点から idJS と addressPLC の両方を取得することだと思います。

ノードの子要素を名前で取得する簡単な方法はないようですが、この便利な関数を追加できます (ここから: PHP DOMElement::getElementsByTagName - とにかくすぐに一致する子を取得するには? ):

/**
 * Traverse an elements children and collect those nodes that
 * have the tagname specified in $tagName. Non-recursive
 *
 * @param DOMElement $element
 * @param string $tagName
 * @return array
 */
function getImmediateChildrenByTagName(DOMElement $element, $tagName)
{
    $result = array();
    foreach($element->childNodes as $child)
    {
        if($child instanceof DOMElement && $child->tagName == $tagName)
        {
            $result[] = $child;
        }
    }
    return $result;
}

次に、次のようになります。

foreach ($config as $module) {
  $idJS = getImmediateChildrenByTagName($module, "idJS")[0];
  if ($idJS->nodeValue == '001') {
      echo getImmediateChildrenByTagName($module, "addressPLC")[0]->nodeValue;
  }
}
于 2013-01-09T13:42:48.110 に答える
0

そのためには本当に xpath を使用する必要があります。

$xp = new DOMXpath($doc);
echo $xp->evaluate('string(//module[./idJS[. = "001"]]/addressPLC[1])');

終わり。また、それは同様に動作しgetElementsByTagNameます。オンラインデモを見る:

<?php

$buffer = <<<BUFFER
<config>
  <module>
    <idJS >001</idJS>
    <addressPLC>41000</addressPLC>
  </module>
  <module>
    <idJS >002</idJS>
    <addressPLC>42000</addressPLC>
  </module> 
</config>
BUFFER;

$doc = new DOMDocument();
$doc->loadXML( $buffer );

$modules = $doc->getElementsByTagName( "module" );

var_dump($modules);

foreach ($modules as $module)
{
    $ids = $module->getElementsByTagName('idJS');
    var_dump($ids);

    foreach ($ids as $id) {
        var_dump($id->nodeValue);
        if ($id->nodeValue == '001') {
            # ...
        }
    }
}

$xp = new DOMXpath($doc);
echo $xp->evaluate('string(//module[./idJS[. = "001"]]/addressPLC[1])');
于 2013-01-09T22:21:15.343 に答える