Используйте Xpath для поиска узлов XML с определенным дочерним элементом - PullRequest
6 голосов
/ 28 февраля 2011

Я новичок в мире XPath. Я хочу использовать XML-подход для питания моего простого веб-сайта портфолио вместо базы данных, что в этом случае было бы излишним, поскольку единственным элементом базы данных были бы сами проекты.

Я создал файл XML со следующей структурой:

<?xml version="1.0" encoding="UTF-8" ?>
<projects>
    <project>
        <title>A-Merchandise</title>
        <slug>a-merchandise</slug>
        <projectType>E-commerce</projectType>
        <launchDate>2007-08-01</launchDate>
    </project>
    ...

Теперь я могу нормально проанализировать этот XML-файл с помощью PHP для просмотра списка, но как мне отфильтровать проекты с помощью XPath? Например, как мне получить все project узлы, у которых есть дочерний projectType узел со значением e-commerce?

Обычно я запускаю SQL-запрос вроде:

SELECT * FROM `projects` WHERE `category` = 'e-commerce';

Каким будет эквивалент XPath? Правильный ли мой XML-файл для такой фильтрации?

Любые указатели были бы великолепны. Заранее спасибо.

Ответы [ 5 ]

7 голосов
/ 28 февраля 2011

Полагаю, вы хотите это:

/projects/project[projectType="e-commerce"]

Фильтр [] выбирает все элементы project в projects, у которых есть projectType дочерний элемент со значением "e-commerce"

Я также обнаружил, этот сайт очень полезен для возни с запросами XPath и XSLT.

Дополнительная информация: http://www.w3schools.com/xpath/xpath_syntax.asp

6 голосов
/ 28 февраля 2011

с учетом того, что ваше xml-имя файла foo.xml и находится в том же каталоге, что и bar.php с содержанием

$projects = simpleXMLElement('foo.xml',null,true);

$ecomProjects = $projects->xpath('project[projectType="E-commerce"]');

foreach($ecomProjects as $ecomProject)
{
echo $ecomProject; // or do whatever with it
}
2 голосов
/ 28 февраля 2011

Вы можете использовать XPath-файлеры, например:

//project[projectType='E-commerce']

В документации XPath (http://www.w3.org/TR/xpath/#predicates) есть этот пример:

chapter[title="Introduction"] выбирает chapter детей из узел контекста, который имеет один или несколько title дети с строковое значение равно Introduction

2 голосов
/ 28 февраля 2011

Bone up на xpath, это очень полезно.Хотя я не люблю w3cshools в целом, их документы xpath довольно хороши.

$doc = new DOMDocument();
$xpath = new DOMXpath($doc);

foreach ($xpath->query("/projects/project") as $node)
{
   if ($node->textContent == "e-commerce")
   {
    // this node is the one you want.
   }
}

или используют чистый xpath

  foreach ($xpath->query("/projects/project[projectType = 'e-commerce']") as $node)
  {
        // grab the $node
  }

Некоторые указатели

Чтобы выбрать узел в любом месте префикса документа с двойной косой чертой, например //nodeYouWant.Чтобы выбрать атрибут, используйте @ т.е. /nodeName[@attribute='attributeValue'] синтаксис.

0 голосов
/ 28 февраля 2011

W3schools - хорошее место для начала.

Возможно, я бы изменил projectType на атрибут проекта, а затем выбрал бы вот так:

//project[@projectType ='e-commerce']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...