【问题标题】:how to write xpath to query an xml file in php如何编写xpath以在php中查询xml文件
【发布时间】:2019-11-26 13:34:59
【问题描述】:

我有一个 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():C:\Program 中的表达式无效 文件 (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 中为 foreach() 提供的参数无效 (x86)\EasyPHP-Devserver-17\eds-www\Freshshop 免费网站模板 - Free-CSS.com\freshshop\successfullogin.php 第 13 行

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;
}

【问题讨论】:

  • 这里有两件事要注意,记住我从未使用过simplexml_load_file 或任何它的相关方法。首先,我想simplexml_load_file 将创建一个Object,您不能使用-&gt;loadXML 或其他方法将其加载到DOMDocument 中......这两个类(simplexmlDOMDocument)是不可互换的——你可能最好简单地做$dom-&gt;load('users.xml') 其次:XPath 表达式与我给出的示例不匹配 - 你需要两个前导斜杠 - 即://users/user 而不是 /users/user
  • @RamRaider..谢谢你的负载..它的工作原理..我使用负载('users.xml)

标签: php xml xpath


【解决方案1】:

您的 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...

【讨论】:

  • 我使用了您提供的代码,但似乎没有查询,尽管文件的内容已加载
  • 您愿意分享一下您是如何实现的吗?
  • 我发布了一个更新,其中包含我使用过的代码
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-14
  • 1970-01-01
  • 2018-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多