簡體   English   中英

如何使用xpath(php)查詢xml文件?

[英]How to query a xml file using xpath (php) ?

我正在嘗試使用XPath查詢XML文件。 但是作為回報,我一無所獲。 我想我將查詢的格式設置為false。

XML

<subject id="Tom">
   <relation unit="ITSupport" role="ITSupporter" />
  </subject>

PHP

$xpath = new DOMXpath($doc);
            $role = 'ITSupporter';
           $elements = $xpath-> query("//subject/@id[../relation/@role='".$role."']");              
           foreach ($elements as $element) {    
              $name = $element -> nodeValue;
              $arr[$i] = $name;
              $i = $i + 1;
           }    

如何獲得ID TOM? 我想將其保存到例如$ var

建立Xpath表達式:

  • 獲取任何subject元素
    //subject
  • ...具有子元素relation
    //subject[relation]
  • 具有給定文本的role屬性的...
    //subject[relation/@role="ITSupporter"]
  • ...並獲取subject@id屬性
    //subject[relation/@role="ITSupporter"]/@id

另外,可以清理源。 PHP數組可以使用$array[]語法將新元素放入其中。

放在一起:

$xml = <<<'XML'
<subject id="Tom">
  <relation unit="ITSupport" role="ITSupporter" />
</subject>
XML;

$role = 'ITSupporter';

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

$ids = [];
foreach ($xpath->evaluate("//subject[relation/@role='".$role."']/@id") as $idAttribute) {
  $ids[] = $idAttribute->value;
}
var_dump($ids);

輸出:

array(1) { 
  [0]=> 
  string(3) "Tom" 
}

如果只期望一個結果,則可以將其轉換為Xpath:

$id = $xpath->evaluate(
  "string(//subject[relation/@role='".$role."']/@id)"
);
var_dump($id);

輸出:

string(3) "Tom"

XML命名空間

查看注釋中發布的示例,您的XML使用不帶前綴的命名空間http://cpee.org/ns/organisation/1.0 XML解析器將解決該問題,因此您可以將節點讀取為{http://cpee.org/ns/organisation/1.0}subject 以下是三個可以解決此問題的示例:

  • <subject xmlns="http://cpee.org/ns/organisation/1.0"/>
  • <cpee:subject xmlns:cpee="http://cpee.org/ns/organisation/1.0"/>
  • <c:subject xmlns:c="http://cpee.org/ns/organisation/1.0"/>

Xpath表達式必須執行相同的操作。 但是,Xpath沒有默認的名稱空間。 您需要注冊一個選擇的使用前綴。 這使Xpath引擎可以將//org:subject解析為//{http://cpee.org/ns/organisation/1.0}subject

PHP不需要太多更改:

$xml = <<<'XML'
<subject id="Tom" xmlns="http://cpee.org/ns/organisation/1.0">
  <relation unit="ITSupport" role="ITSupporter" />
</subject>
XML;

$role = 'ITSupporter';

$document = new DOMDocument();
$document->loadXML($xml);
$xpath = new DOMXpath($document);
// register a prefix for the namespace
$xpath->registerNamespace('org', 'http://cpee.org/ns/organisation/1.0');

$ids = [];
// address the elements using the registered prefix
$idAttributes = $xpath->evaluate("//org:subject[org:relation/@role='".$role."']/@id");
foreach ($idAttributes as $idAttribute) {
  $ids[] = $idAttribute->value;
}
var_dump($ids);

試試這個XPath

//subject[relation/@role='".$role."']/@id

您將謂詞應用於id屬性,而不應用於subject元素。

通過id獲取元素與通過$ role內容獲取元素相同。 因此,如下所示; $xpath->query("//*[@id='$id']")->item(0); 換句話說,@ id應該放在“ [”括號中。

暫無
暫無

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

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