Проблема Xpath, получение идентификатора (атрибута) элемента, если вы знаете заголовок элемента - PullRequest
2 голосов
/ 17 января 2011

Это мой XML-файл, и я хочу знать, как получить идентификатор статьи, когда вы знаете, что это за заголовок.Возможно ли это с помощью Xpath?

XML-файл:

<Articles>
    <Article ID="1">
        <title>test</title>
        <content>test</content>
    </Article>
</Articles>

Код PHP:

$dom = new DOMDocument;
$dom->load("Articles.xml");
$xp = new DOMXPath($dom);
$id = $xp->evaluate('string(/Articles/Article[title="test"]/@ID)');
var_dump($id);

С уважением,

Пользователь.

Ответы [ 2 ]

2 голосов
/ 17 января 2011

Пока вы используете SimpleXml, вы не можете вернуть идентификатор напрямую.Правильный XPath будет

/Articles/Article[title="crack"]/@ID

, как уже показано в другом месте.Но SimpleXml не имеет понятия узлов атрибутов.Он знает только SimpleXmlElements.Таким образом, вы можете также получить узел Article вместо

/Articles/Article[title="crack"]

, потому что в конце вам придется все равно сделать следующее, чтобы получить значение идентификатора:

echo $articles[0]['id'];

Обратите внимание, чтовам не нужен символ @ при доступе к атрибуту из элемента SimpleXml.

Если вы хотите получить атрибут ID напрямую, вам придется использовать DOM ( codepad )

$dom = new DOMDocument;
$dom->loadXml($xml);
$xp = new DOMXPath($dom);
$id = $xp->evaluate('string(/Articles/Article[title="crack"]/@ID)');
var_dump($id);

Вышеприведенное вернет 1, если нет другого узла с элементом заголовка со значением, равным «crack».

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

string(/Articles/Article[normalize-space(title) = "crack"]/@ID)

Если вы хотите искать статьи с заголовком, который содержит взломать частично, используйте

string(/Articles/Article[contains(title, "crack")]/@ID)

Примечаниечто это все равно будет возвращать только идентификатор сразу, пока есть только один результат.Если имеется несколько совпадающих узлов, будет возвращено первое значение идентификатора.Используйте

/Articles/Article[contains(title, "crack")]/@ID

, чтобы вернуть DOMNodeList всех соответствующих узлов, а затем выполнить итерацию по ним, чтобы получить их индивидуальные значения идентификатора.

Также см. основные примеры использования SimpleXml в PHPРуководство

0 голосов
/ 17 января 2011

Путь

/Articles/Article[title = "crack"]/@ID

должен это сделать. Вам не нужно перебирать узлы.

...