我有以下XML结构:
<?xml version="1.0" encoding="ISO-8859-1"?>
<articles>
<article id="1">
<title>Article title 001</title>
<short>Short text</short>
<long>Long text</long>
</article>
<article id="2">
<title>Article title 002</title>
<short>Short text</short>
<long>Long text</long>
</article>
</articles>
我只想选择<title>
和<short>
。
目前使用它来显示所有内容:
$queryResult = $xpathvar->query('//articles/article'); // works fine grabs all articles
foreach($queryResult as $result){
echo $result->textContent;
}
预期输出为:
文章标题001
简短文字
非常感谢任何协助。
工作解决方案!
if ($artId == "") {
$queryResult = $xpathvar->query('//articles/article/*'); // grab all children
foreach($queryResult as $result){
if($result->nodeName === 'title' || $result->nodeName === 'short') {
echo $result->textContent;
}
}
}else{
$queryResult = $xpathvar->query(sprintf('//articles/article[@id="%s"]/*', $artId)); // Show requested article
foreach($queryResult as $result){
if($result->nodeName === 'title' || $result->nodeName === 'long') {
echo $result->textContent;
}
}
}
答案 0 :(得分:3)
您可以使用
/articles/article/*[name()="title" or name()="short"]
只会返回元素名称为“title”或“short”的任何“文章/文章”的子项。
作为替代方案,将XPath更改为/articles/article/*
以获取文章的所有子节点,并在迭代$results
时检查DOMNode::nodeName
是“title”还是“short”,例如
$queryResult = $xpathvar->query('/articles/article/*'); // grab all children
foreach($queryResult as $result){
if($result->nodeName === 'title' || $result->nodeName === 'short') {
echo $result->textContent;
}
}
如果您不想更改XPath,则必须迭代文章的childNodes
,例如
$queryResult = $xpathvar->query('/articles/article');
foreach($queryResult as $result) {
foreach($result->childNodes as $child) {
if($child->nodeName === 'title' || $child->nodeName === 'short') {
echo $child->textContent;
}
}
答案 1 :(得分:1)
使用强>:
/*/*/*[self::title or self::short]
或者是否应显示具有已知title
(例如“2”)的特定short
的{{1}}和article
子项:
@id
尽可能避免使用/*/article[@id='2']/*[self::title or self::short]
缩写(当已知XML文档的结构时)。
使用//
经常会导致评估效率极低,因为//
会导致搜索当前节点中的整个(子)树。