Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 从XML获取特定项_Php_Xml_Dom - Fatal编程技术网

Php 从XML获取特定项

Php 从XML获取特定项,php,xml,dom,Php,Xml,Dom,我搜索了网络和stackoverflow档案,没有找到任何真正帮助我解决这个问题的东西 我有以下XML文件 <?xml version="1.0"?> <Results> <Result> <Step>001</Step> <State>1</State> <Complete>true</Complete> </Result> <R

我搜索了网络和stackoverflow档案,没有找到任何真正帮助我解决这个问题的东西

我有以下XML文件

<?xml version="1.0"?>
<Results>
  <Result>
    <Step>001</Step>
    <State>1</State>
    <Complete>true</Complete>
  </Result>
    <Result>
        <Step>002</Step>
        <State>1</State>
        <Complete>true</Complete>
    </Result>
    <Result>
        <Step>003</Step>
        <State>1</State>
        <Complete>false</Complete>
    </Result>
</Results>

001
1.
真的
002
1.
真的
003
1.
假的
我想在步骤的帮助下得到Complete的值。因此,基本上,客户端调用getSuccess(param),其中param是输入的步骤,例如002。然后我想得到这个特定数组(或结果树)的值。我的代码现在看起来像这样

public function getSuccess($step){

    $doc = new DOMDocument('1.0');
    $doc->formatOutput = true;
    $doc->Load("./API/response.xml");

    // Borat: >>Great Success!<<
    $Borat = $doc->getElementsByTagName('Result');
    foreach ($Borat as $Result) {
        ###########
        #CODE HERE#
        ###########
    }
}
公共函数getSuccess($step){
$doc=新DOMDocument('1.0');
$doc->formatOutput=true;
$doc->Load(“./API/response.xml”);
//Borat:>>非常成功!getElementsByTagName('Result');
foreach($Borat作为$Result){
###########
#代码在这里#
###########
}
}
我现在正在寻找准确的代码来响应结果


提前谢谢。如果有一个主题解决了我的问题,请告诉我,我将关闭此主题。

不知道这是否是解决问题的方法,但您可以尝试以下方法:

public function getSuccess($step)
{
    $xml_string = file_get_contents("./API/response.xml");
    $xml_data = new SimpleXMLElement($xml_string);

    // Search for the parent bij $step
    $nodes = $xml_data->xpath('//Results/Result/Step[.="'.$step.'"]/parent::*');
    return $nodes[0];
}

$Result = getSuccess('002');
print_r($Result);

应该输出:SimpleXMLElement对象([Step]=>002[State]=>1[Complete]=>true)

不知道这是否是正确的方法,但您可以尝试以下方法:

public function getSuccess($step)
{
    $xml_string = file_get_contents("./API/response.xml");
    $xml_data = new SimpleXMLElement($xml_string);

    // Search for the parent bij $step
    $nodes = $xml_data->xpath('//Results/Result/Step[.="'.$step.'"]/parent::*');
    return $nodes[0];
}

$Result = getSuccess('002');
print_r($Result);

应该输出:SimpleXMLElement对象([Step]=>002[State]=>1[Complete]=>true)

您可以在IF条件下比较Step,并获得所需的任何XML节点

例如:我在这里得到“状态”节点

function getSuccess($step) {

    if (file_exists("./response.xml")) {
        $xml = simplexml_load_file("./response.xml");

        foreach ($xml as $Result) {

            if ($step == $Result->Step) {
                $State = $Result->State;
                return $State;
            }
        }
    } else {
        exit('Failed to open test.xml.');
    }

}

echo getSuccess('001');

希望这有帮助。

您可以比较IF条件中的步骤,并获得所需的任何XML节点

例如:我在这里得到“状态”节点

function getSuccess($step) {

    if (file_exists("./response.xml")) {
        $xml = simplexml_load_file("./response.xml");

        foreach ($xml as $Result) {

            if ($step == $Result->Step) {
                $State = $Result->State;
                return $State;
            }
        }
    } else {
        exit('Failed to open test.xml.');
    }

}

echo getSuccess('001');

希望这有帮助。

你能试试这个吗?感谢您的回答,我可以访问步骤和完成,但我希望“在步骤=$step in result中获得完成”。是的,您可以通过在foreach中放置“IF”条件来实现这一点。请检查我下面的答案,看一个例子。你能试试这个吗?感谢您的回答,我可以访问步骤和完成,但我希望“在步骤=$step in result中获得完成”。是的,您可以通过在foreach中放置“IF”条件来实现这一点。请检查我下面的答案以获得一个例子。奇怪的是,当我使用print_r($Result)时,我得到了:simplexmlement对象([Step]=>002[State]=>1[Complete]=>true)欢迎您!我的第一个答案是:)很高兴能帮到+1这个不错的答案,我认为XPath是解决这个问题的方法,提高了可读性。我正要发布与以下XPath类似的东西
“//Result/Complete[../Step='$Step']”
。你的提供了更多的上下文(整个结果节点),我的只返回完整的节点。奇怪的是,当我使用print\r($Result)时,我得到了:simplexmlement对象([Step]=>002[State]=>1[Complete]=>true)你的欢迎!我的第一个答案是:)很高兴能帮到+1这个不错的答案,我认为XPath是解决这个问题的方法,提高了可读性。我正要发布与以下XPath类似的东西
“//Result/Complete[../Step='$Step']”
。你的提供了更多的上下文(整个结果节点),我的只返回完整的节点。谢谢,这正是我要找的。谢谢,这正是我要找的。