Необходимо показать дочерние данные по родительскому идентификатору - PullRequest
1 голос
/ 15 июля 2011

Я борюсь с Xpath, у меня есть список xml, и мне нужно получить дочерние данные на основе родительского идентификатора ...

Мой xml файл:

<projecten>
<project id="1">
    <titel>Shop 1</titel>
    <siteurl>http://test.be</siteurl>
    <screenshot>test.jpg</screenshot>
    <omschrijving>comment 1</omschrijving>
</project>
<project id="2">
    <titel>Shop 2</titel>
    <siteurl>http://test2.be</siteurl>
    <screenshot>test2.jpg</screenshot>
    <omschrijving>comment</omschrijving>
</project>
</projecten>

код, который я использую, чтобы получить, например, данные проекта 1 (не работает):

$xmlDoc = new DOMDocument();
$xmlDoc->load(data.xml);
$xpath = new DOMXPath($xmlDoc);

$projectId = '1';   
$query = '//projecten/project[@id='.$projectId.']';

$details = $xpath->query($query);

foreach( $details as $detail )
{
    echo $detail->titel;
    echo $detail->siteurl;
    echo $detail->screenshot;
    echo $detail->omschrijving;     
}

Но это ничего не показывает, если кто-то может указать мне ... спасибо

Ответы [ 2 ]

1 голос
/ 15 июля 2011

В дополнение к уже указанному решению вы также можете использовать:

foreach ($xpath->query(sprintf('/projecten/project[@id="%d"]', $id)) as $projectNode) {
    echo
        $projectNode->getElementsByTagName('titel')->item(0)->nodeValue,
        $projectNode->getElementsByTagName('siteurl')->item(0)->nodeValue,
        $projectNode->getElementsByTagName('screenshot')->item(0)->nodeValue,
        $projectNode->getElementsByTagName('omschrijving')->item(0)->nodeValue;
}

или извлеките значения узла DOMText напрямую с помощью Xpath

foreach ($xpath->query(sprintf('/projecten/project[@id="%d"]', $id)) as $projectNode) {
    echo
        $xpath->evaluate('string(titel)', $projectNode),
        $xpath->evaluate('string(siteurl)', $projectNode),
        $xpath->evaluate('string(screenshot)', $projectNode),
        $xpath->evaluate('string(omschrijving)', $projectNode);
}

или импортируйте узел в SimpleXml

foreach ($xpath->query(sprintf('/projecten/project[@id="%d"]', $id)) as $projectNode) {
    $detail = simplexml_import_dom($projectNode);
    echo
        $detail->titel,
        $detail->siteurl,
        $detail->screenshot,
        $detail->omschrijving;
}

или даже объединить все значения непосредственно в XPath:

$xpath = new DOMXPath($dom);
echo $xpath->evaluate(
    sprintf(
        'concat(
            /projecten/project[@id = %1$d]/titel,
            /projecten/project[@id = %1$d]/siteurl,
            /projecten/project[@id = %1$d]/screenshot,
            /projecten/project[@id = %1$d]/omschrijving
         ', $id
    )
);
0 голосов
/ 15 июля 2011

Доступ к дочерним узлам, как у вас:

echo $detail->title;

Недопустимо, если вы используете функции DOM *.Это, вероятно, сработает, если вы используете SimpleXML .

Для DOM * попробуйте это:

$dom = new DOMDocument;
$dom->loadXml('<projecten>
<project id="1">
    <titel>Shop 1</titel>
    <siteurl>http://test.be</siteurl>
    <screenshot>test.jpg</screenshot>
    <omschrijving>comment 1</omschrijving>
</project>
<project id="2">
    <titel>Shop 2</titel>
    <siteurl>http://test2.be</siteurl>
    <screenshot>test2.jpg</screenshot>
    <omschrijving>comment</omschrijving>
</project>
</projecten>
');

$id = 2;
$xpath = new DOMXPath($dom);
foreach ($xpath->query(sprintf('/projecten/project[@id="%s"]', $id)) as $projectNode) {
    // repeat this for every needed node
    $titleNode = $xpath->query('titel', $projectNode)->item(0);
    if ($titleNode instanceof DOMElement) {
        echo $titleNode->nodeValue;
    }

    // or us a loop for all child nodes
    foreach ($projectNode->childNodes as $childNode) {
        echo $childNode->nodeValue;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...