是否有任何方法可以基于一个属性和节点值使用XPATH删除节点?

时间:2019-04-25 16:55:54

标签: php xml xpath

我正在尝试使用XPATH和php删除节点,同时出现两个XPATH查询。

我正在使用php 5解决此问题。我尝试使用DOMDocument时遇到问题。

enter code here
//The php file
$xml_str = file_get_contents("projectTest.xml");
$xml = new SimpleXMLElement($xml_str);


echo $xml->saveXML();
unset($xml->xpath("/project/Item/username[@date='2019-04-20'] and 
/project/Item/username/clientID[text()=='10000']")[0]->{0});
echo $xml->saveXML();



//The XML File
<project>   
   <Item>
     <username date="2019-04-20">
      <clientID>10000</clientID>
     </username>
     <name>Test1</name>
     <price>200</price>
     <quantity>1</quantity>
  </Item>
  <Item>
    <username date="2019-06-23">
      <clientID>3</clientID>
    </username>
    <name>Test2</name>
     <price>200</price>
   <quantity>1</quantity>

 </Item>

enter code here

<!-------- Expected:
  <project>
    <Item>
       <username date="2019-06-23">
         <clientID>3</clientID>
       </username>
       <name>Test2</name>
       <price>200</price>
      <quantity>1</quantity>

   </Item>
</project>

实际结果: 上面的代码生成错误。 附注:我刚刚开始学习如何使用XPATH,但在理解语法如何工作时遇到了问题。

1 个答案:

答案 0 :(得分:2)

很难用不正确的代码对需求进行反向工程,但是我怀疑

"/project/Item/username[@date='2019-04-20'] and 
/project/Item/username/clientID[text()=='10000']"

应该是

"/project/Item/username[@date='2019-04-20' and clientID='10000']"

and是一个布尔运算符,如果将其应用于两个节点集,则两个节点集均为非空时,结果为true;否则,结果为true。因此,表达式的最终结果是布尔值,而不是节点集。

语法错误是因为XPath相等运算符是“ =”,而不是“ ==”。