【问题标题】:xpath query DOMNodeList Object ( [length] => 0 )xpath 查询 DOMNodeList 对象 ( [length] => 0 )
【发布时间】:2018-12-05 02:12:31
【问题描述】:

我想选择具有特定属性值的元素。这是我的 xml 代码示例:

    <response>
<result name="response" numFound="1171" start="0" maxScore="1.0">
<doc>
<float name="score">1.0</float>
<arr name="bm_field_candidat_valid_indexing">
<bool>false</bool>
</arr>
<str name="content">
Etudiant, jeune diplômé Informatique, nouvelles technologies Bac+5 
</str>
<arr name="sm_field_candidat_telephone">
<str>0336548651</str>
</arr>
<arr name="sm_field_candidat_ville">
<str>madrid</str>
</arr>
<arr name="sm_field_profil_candidat_compete">
<str>
Logiciel(s) bureautique: Base de données (type Access...), Présentation (type Powerpoint...), Tableur (type Excel...), Traitement de texte (type Word...) | Langage(s) de programmation: C/C++, Delphi(5/6), VB(5/6), C++builder, Java, SQL, Merise, ASP | Logiciel(s): Dreamweaver
</str>
</arr>
<arr name="sm_vid_Career_levels">
<str>Etudiant, jeune diplômé</str>
</arr>
<arr name="sm_vid_Countries">
<str>Maroc</str>
<str>Liste non ordonnée</str>
</arr>
<arr name="sm_vid_Education_levels">
<str>Bac+5 et plus</str>
</arr>
<arr name="sm_vid_Languages">
<str>maternelle</str>
</arr>
<str name="ss_name_formatted">evinalio</str>
<str name="teaser">
Etudiant, jeune diplômé americaine Mr fant rue de Libourne  » Informatique, nouvelles technologies  
</str>
<arr name="tm_vid_13_names">
<str>maternelle arabe</str>
</arr>
</doc>
</result>
</response>

我想获取属性名称定义的值,这是我的代码:

 $url = "http://192.168.164.237:nOther=&hl.fl=";
  $xml = simplexml_load_file($url);
  $string = $xml->asXML();
  $res = simplexml_load_string($string, 'SimpleXMLElement', LIBXML_NOCDATA | LIBXML_NOBLANKS);
  $res = $res->xpath('//doc');

  $dom = new DOMDocument();
  $dom->preserveWhiteSpace = false;
  $dom->loadXml($res);
  $dom->saveXML();

  $xPath = new DOMXPath($dom); 
  $storeNodes = $xPath->query( '//arr[@name="sm_field_profil_candidat_compete"]');
  print_r($storeNodes);

这就是我得到的:

DOMNodeList 对象 ( [length] => 0 )

【问题讨论】:

标签: php xml dom


【解决方案1】:

您不能将 SimpleXMLElement 数组加载为 XML 字符串。使用dom_import_simplexml()

$docElement = $res->xpath('//doc')[0];
$docNode = dom_import_simplexml($docNode);
$domDocument = $docNode->ownerDocument();
$xpath = new DOMXpath($domDocument);

但是这里根本不需要将响应加载到 SimpleXML 中:

$xml = file_get_contents($url);
$document = new DOMDocument();
$document->preserveWhiteSpace = false;
$document->loadXml($xml);
$xpath = new DOMXpath($document); 

$storeNodes = $xpath->query(
  '//doc//arr[@name="sm_field_profil_candidat_compete"]'
);
var_dump($storeNodes);

输出:

object(DOMNodeList)#4 (1) {
  ["length"]=>
  int(1)
}

如果您有多个 doc 元素,您可以先获取它们并将它们用作第二个表达式的上下文:

foreach ($xpath->query('//doc') as $docNode) {
  $storeNodes = $xpath->query(
    './/arr[@name="sm_field_profil_candidat_compete"]', $docNode
  );
  var_dump($storeNodes);
}

【讨论】:

  • 如果我有多个文档节点,变量 $storesNodes 将包含所有文档的所有数据元素,但在我的情况下,我想对每个文档进行迭代,以便我可以将每个元素分开处理。在这种情况下我该怎么办?
  • 为此添加了一个示例。
猜你喜欢
  • 2012-01-14
  • 1970-01-01
  • 2022-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多