Php 带有XML和XPath的Symfony DomCrawler

Php 带有XML和XPath的Symfony DomCrawler,php,xml,symfony,xpath,domcrawler,Php,Xml,Symfony,Xpath,Domcrawler,我正在尝试获取所有title元素,并将它们保存在一个数组中 XML: <?xml version="1.0" encoding="UTF-8"?> <mylist> <element> <id>1</id> <title>Example 1</title> <status>2</status> <my_statu

我正在尝试获取所有
title
元素,并将它们保存在一个数组中

XML:

<?xml version="1.0" encoding="UTF-8"?>
<mylist>
    <element>
        <id>1</id>
        <title>Example 1</title>
        <status>2</status>
        <my_status>2</my_status>
    </element>
    <element>
        <id>2</id>
        <title>Example 2</title>
        <status>1</status>
        <my_status>1</my_status>
    </element>
    <element>
        <id>3</id>
        <title>Example 3</title>
        <status>2</status>
        <my_status>6</my_status>
    </element>
    <element>
        <id>4</id>
        <title>Example 4</title>
        <status>3</status>
        <my_status>6</my_status>
    </element>
    <element>
        <id>5</id>
        <title>Example 5</title>
        <status>1</status>
        <my_status>6</my_status>
    </element>
</mylist>
$crawler = new Crawler();
$crawler->addXmlContent($data);

$result = $crawler->filterXPath('/mylist/element[not(status=3) and my_status=6]/title/text()');
元素节点需要满足一些条件,因此调用
$result->count()
应该打印
2
(示例3和示例5),但它打印0

谢谢

编辑:

<?xml version="1.0" encoding="UTF-8"?>
<mylist>
    <element>
        <id>1</id>
        <title>Example 1</title>
        <status>2</status>
        <my_status>2</my_status>
    </element>
    <element>
        <id>2</id>
        <title>Example 2</title>
        <status>1</status>
        <my_status>1</my_status>
    </element>
    <element>
        <id>3</id>
        <title>Example 3</title>
        <status>2</status>
        <my_status>6</my_status>
    </element>
    <element>
        <id>4</id>
        <title>Example 4</title>
        <status>3</status>
        <my_status>6</my_status>
    </element>
    <element>
        <id>5</id>
        <title>Example 5</title>
        <status>1</status>
        <my_status>6</my_status>
    </element>
</mylist>
$crawler = new Crawler();
$crawler->addXmlContent($data);

$result = $crawler->filterXPath('/mylist/element[not(status=3) and my_status=6]/title/text()');
找到解决方案后,XPath应为:

$result = $crawler->filterXPath('//mylist/element[not(status=3) and my_status=6]/title/text()');

从污秽注释

 * The XPath expression is evaluated in the context of the crawler, which
 * is considered as a fake parent of the elements inside it.
 * This means that a child selector "div" or "./div" will match only
 * the div elements of the current crawler, not their children.
然后在方法内部
$xpath=$this->relativize($xpath)应用于修改路径的位置

对我来说,最简单的解决方案就是使用相对路径,比如
/mylist


但如果您能够理解这里发生了什么,绝对路径应该是可能的,我认为

如果这解决了您的问题,那么您就有了一个不同的XML结构。