簡體   English   中英

如何在php中編寫xpath來查詢一個xml文件

[英]how to write xpath to query an xml file in php

我有一個 xml 文件,我想從 php 頁面查詢。實際上,該文件包含用戶的用戶名和密碼。我想查詢該文件並查看用戶名和密碼是否匹配。這是我的代碼php頁面:

<?php
$username=$_POST['username'];
$password=$_POST['password'];


$xml = simplexml_load_file('users.xml') or 
    die("error :cannot create object");
    print_r($xml);


$result = $xml->xpath("/user[username=".$username."] and //user[password=".$password."]");

foreach ($result as $node){
    echo $node->id;
    echo $node->username;
}

xml文件

<?xml version="1.0" encoding="utf-8"?>
<users xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">


<user>
<id>1</id>
<username>mygirl</username>
<password>mygirl1234</password>
<email>mygirl@hotmail.com</email>
</user>

例外

警告:SimpleXMLElement::xpath(): Invalid expression in C:\\Program Files (x86)\\EasyPHP-Devserver-17\\eds-www\\Freshshop 免費網站模板 - Free-CSS.com\\freshshop\\successfullogin.php 第 11 行

警告:SimpleXMLElement::xpath(): xmlXPathEval: 評估在 C:\\Program Files (x86)\\EasyPHP-Devserver-17\\eds-www\\Freshshop 免費網站模板 - Free-CSS.com\\freshshop\\successfullogin.php 中失敗11號線

警告:在 C:\\Program Files (x86)\\EasyPHP-Devserver-17\\eds-www\\Freshshop 免費網站模板 - Free-CSS.com\\freshshop\\successfullogin.php 第 13 行中為 foreach() 提供的參數無效

UPDATE
$xml = simplexml_load_file('users.xml') or 
die("error :cannot create object");

$username='neem88';
$pwd='dbhcasvc';
$query=sprintf('/users/user[ username="%s" and password="%s" ]', $username, 
$pwd );


libxml_use_internal_errors( true );
$dom=new DOMDocument();
$dom->validateOnParse=false;
$dom->recover=true;
$dom->strictErrorChecking=false;
$dom->loadXML( $xml );
$errors = libxml_get_errors();
libxml_clear_errors();

$xp=new DOMXPath( $dom );
$col=$xp->query( $query );

if( $col->length > 0 ){
foreach( $col as $node )echo $node->id;
}

您的 XPath 表達式非常接近,但您的做法略有錯誤。 您正在嘗試匹配兩個子元素,因此 XPath 查詢應該在[ square braces ]內包含兩個元素

查詢將采用以下形式:

//users/user[ username="X" and password="Y" ]

把它們放在一起

$strxml='<?xml version="1.0" encoding="utf-8"?>
<users xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <user>
        <id>1</id>
        <username>mygirl</username>
        <password>mygirl1234</password>
        <email>mygirl@hotmail.com</email>
    </user>
    <user>
        <id>2</id>
        <username>mybanana</username>
        <password>myb4n4n4</password>
        <email>mybanana@hotmail.com</email>
    </user>
    <user>
        <id>3</id>
        <username>mytrumpet</username>
        <password>mytrumpet</password>
        <email>mytrumpet@hotmail.com</email>
    </user>
</users>';


$username='mybanana';
$pwd='myb4n4n4';

/* put both elements and values within square braces - combine with AND */
$query=sprintf('//users/user[ username="%s" and password="%s" ]', $username, $pwd );


libxml_use_internal_errors( true );
$dom=new DOMDocument;
$dom->validateOnParse=false;
$dom->recover=true;
$dom->strictErrorChecking=false;
$dom->loadXML( $strxml );
$errors = libxml_get_errors();
libxml_clear_errors();

$xp=new DOMXPath( $dom );
$col=$xp->query( $query );

if( $col->length > 0 ){
    foreach( $col as $node )echo $node->nodeValue;
}

這將輸出

2 mybanana myb4n4n4 mybanana@hotmail.com

我想你應該能夠很容易地將它調整到simple_xml ......

暫無
暫無

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

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