选择一些但不是所有子节点

时间:2010-10-20 10:30:00

标签: php xml xpath

我有以下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;
      }
    }
}

2 个答案:

答案 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文档的结构时)。

使用//经常会导致评估效率极低,因为//会导致搜索当前节点中的整个(子)树。