-4

目的 :

特定の「id」を持つネストされた要素を取得するメソッドを作成します。

私が試したこと:

  • DOMXpath クラスのクエリ メソッドを使用して、x パス式を含むコードを取得します。空のノード リストが返されるたびに
    • '/row[@id=' . $id . ']'
    • '//table/row[@id=' . $id . ']'
    • '/ / [@id=' . $id . ']'
  • DOMDocument::getElementById を試してみて、DOMDocument クラスをインスタンス化した直後に DOMDocument::$validateOnParse を設定しました。これも空のノード リストを返します。

XML の例:

<?xml version="1.0" encoding="UTF-8"?>
<table>
  <row id="1">
    <job>construction</job>
    <age>34</age>
    <name>bob</name>
  </row>
  <row id="2">
    <job>construction</job>
    <age>34</age>
    <name>bob</name>
  </row>
  <row id="3">
    <job>construction</job>
    <age>34</age>
    <name>bob</name>
  </row>
  <row id="4">
    <job>construction</job>
    <age>34</age>
    <name>bob</name>
  </row>
</table>

Php コード :

Class SimpleORM{

    ...

    public function find($id)
    {
        settype($id, "int");
        $xpath = new DOMXPath($this->_dom);
        $expression = '/row[@id=' . $id . ']';
        return $xpath->query($expression);
    }

}

完全な Php コードはここで読むことができます -> https://github.com/Danoon/SimpleORM/blob/master/SimpleORM.php

質問 :

適切な要素/ノードが返されないのはなぜですか?どうすればこれを達成できますか?

検索機能の呼び出し

$users = new SimpleORM("users");
$result = $users->find(1);
4

3 に答える 3

2

DOMDocument を使用していると、オブジェクトが取得されます。したがって、以下のように取得する必要があります。

$users = new SimpleORM("table.xml");
//print $users->_dom->saveXML();die;
$result = $users->find(1);
if($result->length)
{
    print $result->item(0)->nodeValue;
}

注: 上記のコードから適切な結果が得られています。

提案:

関数呼び出しを改善できますfind($id)

現在の関数は、すべてのthree(job, age, name)値をまとめて提供します。ただし、より柔軟にしたい場合は、追加のパラメーターを渡すことができますfind($id, $withChildren)。以下は、サンプルの推奨コードです。

public function find($id, $withChildren=false)
{
    $xpath = new DOMXPath($this->_dom);
    if($withChildren)
    {
        $expression = '//table/row[@id=' . $id . ']/*';
    }
    else
        $expression = '//table/row[@id=' . $id . ']';

    return $xpath->query($expression);
}

すべての結果の子要素をループで取得できる場所のように呼び出すことができます。nodeNameそれにより、どちらの見栄えで印刷することもできnodeValueます。

$users = new SimpleORM("table.xml");
$result = $users->find(1, true);

if($result->length)
{
    foreach ($result as $n){
        echo $n->nodeName." : ".$n->nodeValue."<br/>";
    }
}
于 2013-05-20T11:37:24.313 に答える
2

あなたは正しい道を進んでいましたが、間違いを犯しました。XPath を使用すると、ソリューションは非常に簡単になります。

'//row[@id="' . $id . '"]'

id属性を囲む " (二重引用符) を忘れました。

于 2013-05-20T11:18:20.990 に答える
1

これを試して

    <?php
    $slideids = array();
    $get_id = 2; 
    $xml = new DOMDocument();
    $xml->load('test.xml'); // path of your XML file ,make sure path is correct
    $xpd = new DOMXPath($xml);
    false&&$result_data = new DOMElement(); //this is for my IDE to have intellysense
    $result = $xpd->query("//row[@id=".$get_id."]/*");  // change the table naem here
    foreach($result as $result_data){
        $key = $result_data->nodeName;
        $values = $result_data->nodeValue;
        $slideids[$key] = $values;
    }

    echo '<pre/>';
    print_r($slideids);
?>

XPath クエリ/式のリファレンス マニュアルの並べ替え

于 2013-05-20T11:47:32.750 に答える