PHP DOMPATH未定义变量错误

PHP DOMPATH未定义变量错误,php,dom,xpath,Php,Dom,Xpath,我有一个这样设置的XML文件 <feeds><feed id=""> <headline></headline> <author></author> <datetime></datetime> <link></link> <description></description> </feed></feeds> 如果有人能帮我或者至

我有一个这样设置的XML文件

<feeds><feed id="">
<headline></headline>
<author></author>
<datetime></datetime>
<link></link>
<description></description>
</feed></feeds>

如果有人能帮我或者至少给我指出正确的方向,我会非常感激。

您正在获取子节点(
headline
,'author',…)作为属性。doElement::getAttribute()将始终返回标量值,即属性节点的值。示例XML中唯一的属性节点是
id
。因此,您需要按名称获取子节点

我建议使用
DOMXpath::evaluate()
。它可以从Xpath表达式返回标量值

$xpath->evaluate('string(headline)', $feed);
headline
将为
$feed
获取具有该名称的所有子节点。Xpath函数
string()
将第一个节点强制转换为字符串,返回其文本内容或空字符串

这也适用于复杂的Xpath表达式。因为转换是在Xpath中完成的,所以可以避免许多验证返回值的条件。根据Xpath表达式,您将始终知道是获得节点列表还是标量

$xml = <<<'XML'
<feeds>
  <feed id="123">
    <headline>Headline</headline>
    <author>Author</author>
    <datetime>Someday</datetime>
    <link>Url</link>
    <description>Some text</description>
  </feed>
</feeds>
XML;

$document = new DOMDocument();
$document->loadXml($xml);
$xpath = new DOMXpath($document);

$id = '123';

$feedList = $xpath->evaluate("/feeds/feed[@id='$id']");
foreach ($feedList as $feed) {
  var_dump(
    [
      'headline' => $xpath->evaluate('string(headline)', $feed),
      'author' => $xpath->evaluate('string(author)', $feed),
      'link' => $xpath->evaluate('string(link)', $feed),
      'image' => $xpath->evaluate('string(image)', $feed),
      'description' => $xpath->evaluate('string(description)', $feed),
      'datetime' => $xpath->evaluate('string(datetime)', $feed),
    ]
  ); 
}
$xml = <<<'XML'
<feeds>
  <feed id="123">
    <headline>Headline</headline>
    <author>Author</author>
    <datetime>Someday</datetime>
    <link>Url</link>
    <description>Some text</description>
  </feed>
</feeds>
XML;

$document = new DOMDocument();
$document->loadXml($xml);
$xpath = new DOMXpath($document);

$id = '123';

$feedList = $xpath->evaluate("/feeds/feed[@id='$id']");
foreach ($feedList as $feed) {
  var_dump(
    [
      'headline' => $xpath->evaluate('string(headline)', $feed),
      'author' => $xpath->evaluate('string(author)', $feed),
      'link' => $xpath->evaluate('string(link)', $feed),
      'image' => $xpath->evaluate('string(image)', $feed),
      'description' => $xpath->evaluate('string(description)', $feed),
      'datetime' => $xpath->evaluate('string(datetime)', $feed),
    ]
  ); 
}
array(6) {
  ["headline"]=>
  string(8) "Headline"
  ["author"]=>
  string(6) "Author"
  ["link"]=>
  string(3) "Url"
  ["image"]=>
  string(0) ""
  ["description"]=>
  string(9) "Some text"
  ["datetime"]=>
  string(7) "Someday"
}