0

XMLは次のとおりです。

<Routes>
    <Route type="source">
        <Name>incoming</Name>
    <Table><Tablename>incoming</Tablename></Table>
    </Route>
    <Route type="dest">
        <Name>outgoing</Name>
    </Route>
</Routes>

私の目標は、Route / Table / Tablenameから「incoming」を出力しようとすることですが、関数を持つクラスを使用します。

$doc = new SimpleXMLElement('routingConfig.xml', null, true);

class traverseXML
    {
    function getData($path = "Route", $type, $operation){
        global $doc;


        if($type == "table"){
            $path = $path."[1]/Table/Tablename";
            }

        if($operation == "value"){
            return $doc->xpath($path);
            }

        }   

        }
$traverseXML = new traverseXML;

これは値を返すと思っていたでしょうが、配列を返します。

echo $traverseXML->getData("Route", "table", "value");  
//returns: Array

代わりにこれを行う場合:

print_r($traverseXML->getData("Route", "table", "value"));
//returns: Array ( )

値の代わりに配列を返すのはなぜですか?

よろしくお願いします。

4

2 に答える 2

1

SimpleXMLElement::xpath()見つかったアイテムを含む配列を返します(アイテムが1つしかない場合でも)。配列が必要ない場合は、関数を変更して、XPathクエリから返された結果を確認し、必要なものをすべて返します。

例えば、

    if ($operation == "value") {
        $results = $doc->xpath($path);

        if (empty($results)) {
            return NULL;
        }

        return (string) $results[0];
    }
于 2012-08-30T19:19:50.027 に答える
0

そのXPathはノードセット、つまり式に一致するすべてのノードのリストを返すためです。この特定のケースでは、一致するノードは1つだけですが、XPathは原則としてリストを返すため、これはPHPの配列にマップされていると思います。

次のようなXPathを使用してみてください

string(Route[1]/Table/Tablename)

XPath標準関数string()を使用して、ノードセットを単一の文字列に変換します。これにより、値が得られます。

于 2012-08-30T19:04:44.240 に答える