簡體   English   中英

如何使用XPath PHP獲取XML元素

[英]How to get element xml using xpath php

我在使用xpath php獲取元素xml時遇到問題,我已經創建了一個php文件,以通過使用xpath php提取“屬性” xml。

我想要的是如何使用xpath提取xml中的每個元素。

的test.xml

<?xml version="1.0" encoding="UTF-8"?>
<InvoicingData>
 <CreationDate> 2014-02-02 </CreationDate>
 <OrderNumber> XXXX123 </OrderNumber>
 <InvoiceDetails>
   <InvoiceDetail>
   <SalesCode> XX1A </SalesCode>
   <SalesName> JohnDoe </SalesName>
</InvoiceDetail>
</InvoiceDetails>
</InvoicingData>

read.php

<?php
$doc = new DOMDocument();
$doc->loadXML(file_get_contents("test.xml"));
$xpath = new DOMXpath($doc);
$nodes = $xpath->query('//*');
$names = array();
foreach ($nodes as $node)
{
    $names[] = $node->nodeName;
}
echo join(PHP_EOL, ($names));
?>

從上面的代碼中,它將像這樣打印:

CreationDate訂單號InvoiceDetails InvoiceDetail SalesCode SalesName

所以,問題是,如何獲取屬性內的元素, 基本上這就是我要打印的內容

2014-02-02 XXXX123 XX1A JohnDoe

您可以使用$node->textContent來獲取節點(及其后代,如果有)的文本值。


針對您的第一條評論:

您沒有使用$node->textContent 嘗試這個:

$doc = new DOMDocument();
$doc->loadXML(file_get_contents("test.xml"));
$xpath = new DOMXpath($doc);
$nodes = $xpath->query('//*');
$names = array();
$values = array(); // created a separate array for the values
foreach ($nodes as $node)
{
  $names[]  = $node->nodeName;
  $values[] = $node->textContent; // push to $values array
}
echo join(PHP_EOL, ($values));

但是,如果只希望在文本值是元素的直接子代時推送文本值,並且仍然希望收集所有節點名,則可以執行以下操作:

foreach ($nodes as $node)
{
  $names[] = $node->nodeName;
  // check that this node only contains one text node
  if( $node->childNodes->length == 1 && $node->firstChild instanceof DOMText ) {
    $values[] = $node->textContent;
  }
}
echo join(PHP_EOL, ($values));

而且,如果您只關心直接包含文本值的節點,則可以執行以下操作:

// this XPath query only selects those nodes that directly contain non-whitespace text
$nodes = $xpath->query('//*[./text()[normalize-space()]]');
$values = array();
foreach ($nodes as $node)
{
  // add nodeName as key
  // (only works reliable of there's never a duplicate nodeName in your XML)
  // and add textContent as value
  $values[ $node->nodeName ] = trim( $node->textContent );
}

var_dump( $values );

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM