【问题标题】:Getting specific item from XML从 XML 获取特定项目
【发布时间】:2016-08-04 11:30:28
【问题描述】:

我搜索了网络和 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>

我想在 Step 的帮助下获得 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#
        ###########
    }
}

我现在正在寻找回显结果的确切代码。

提前致谢。如果有一个话题可以解决我的问题,请告诉我,我会关闭这个话题。

【问题讨论】:

  • 你可以试试这个吗? simplexml_load_file
  • 感谢您的回答,我可以访问 step 并完成,但我希望“获得 Complete where step = $step in result”
  • 是的,您可以通过在 foreach 中放置 'IF' 条件来做到这一点。请在下面查看我的答案以获取示例。

标签: php xml dom


【解决方案1】:

你可以在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');

希望这会有所帮助。

【讨论】:

  • 谢谢,这正是我想要的。
【解决方案2】:

不知道是否可行,但你可以试试这个:

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 Object ([Step] => 002 [State] => 1 [Complete] => true)

【讨论】:

  • 奇怪,当我使用 print_r($Result) 我得到:SimpleXMLElement Object ( [Step] => 002 [State] => 1 [Complete] => true )
  • 欢迎您!我对 SO 的第一个回答,所以还是新手 :) 很高兴提供帮助
  • +1 不错的答案,我认为 XPath 是解决这个问题的方法,提高了可读性。我正要发布与以下 XPath "//Result/Complete[../Step = '$step']" 类似的内容。你的提供更多上下文(整个结果节点),我的只返回完整节点。
猜你喜欢
  • 2014-11-08
  • 1970-01-01
  • 2022-12-12
  • 1970-01-01
  • 1970-01-01
  • 2021-05-28
  • 1970-01-01
  • 2011-11-22
  • 2016-02-09
相关资源
最近更新 更多