php根据其他节点值从xml获取节点值

时间:2016-06-08 21:57:04

标签: php xml

我目前有一个xml文件格式如下:

    <SKUQuestions>
       <SKUQuestion>
          <Tag>FrontCamaraWorks</Tag>
          <Question>Does the front Camera Work?</Question>
          <Answer>Yes</Answer>
       </SKUQuestion>
       <SKUQuestion>
          <Tag>BackCamaraWorks</Tag>
          <Question>Does the Rear Camera Work?</Question>
          <Answer>No</Answer>
       </SKUQuestion>
    </SKUQuestions>

我目前正在收到&#34;答案&#34;节点通过调用它在xml中出现的位置,例如:

    $qFrontCameraWorks = $data['skuQuestions']->SKUQuestion[4];
    $data['frontCameraWorks'] = str_replace("'", "\'", $qFrontCameraWorks->Answer);

我的问题是xml文件并不总是以相同的顺序来找我。

所以,我想要找到一种方法来查询&#34; SKUquestion&#34;节点如果&#34;标签&#34;是一回事它会返回&#34;答案&#34;的价值。同一个SKUquestion节点中的节点。

例如,如果标签是&#34; FrontCamaraWorks&#34;那么$ data [&#39; frontCameraWorks&#39;]是肯定的。

2 个答案:

答案 0 :(得分:0)

您可以参考此链接了解详情:http://php.net/manual/en/function.simplexml-load-file.php

我也给你一个例子供你理解。
将XML字符串($ buffer)转换为简化的数组ignore属性,并使用相同的名称对子元素进行分组:

    function XML2Array(SimpleXMLElement $parent)
{
    $array = array();

    foreach ($parent as $name => $element) {
        ($node = & $array[$name])
            && (1 === count($node) ? $node = array($node) : 1)
            && $node = & $node[];

        $node = $element->count() ? XML2Array($element) : trim($element);
    }

    return $array;
}

$xml   = simplexml_load_string($buffer);
$array = XML2Array($xml);
$array = array($xml->getName() => $array);

Result:

Array
(
    [SKUQuestions] => Array
        (
            [SKUQuestion] => Array
                (
                        [Tag] => 
                        [Question] => 
                        [Answer] => 

                )

        )

)


然后,无论您的购买顺序如何,您都可以参考答案标签。我希望它会有所帮助。

答案 1 :(得分:0)

只需运行XPath查询表达式即可。作为信息,XPath是一种用于引用XML文档部分的声明性语言。 PHP的SimpleXMLElement类可以运行在数组中返回的XPath查询:

$xmlstr = "<SKUQuestions>
                <SKUQuestion>
                   <Tag>FrontCamaraWorks</Tag>
                   <Question>Does the front Camera Work?</Question>
                   <Answer>Yes</Answer>
                </SKUQuestion>
                <SKUQuestion>
                   <Tag>BackCamaraWorks</Tag>
                   <Question>Does the Rear Camera Work?</Question>
                   <Answer>No</Answer>
                </SKUQuestion>
            </SKUQuestions>";

# LOAD STRING XML
$xml = new SimpleXMLElement($xmlstr);

# RUN XPATH QUERY
$queryResult = $xml->xpath('//SKUQuestion[Tag="FrontCamaraWorks"]/Answer');

# OUTPUT VALUE
echo $queryResult[0];
# Yes

或者,你可以使用PHP的DOMXPath使用query()方法返回DOMNodelist(不是数组):

# LOAD STRING XML
$xmldoc = new DOMDocument();
$xmldoc->loadXML($xmlstr);

# INITIALIZE AND RUN QUERY
$xpathvar = new DOMXPath($xmldoc);    
$queryResult = $xpathvar->query('//SKUQuestion[Tag="FrontCamaraWorks"]/Answer');

# ITERATE DOM NODE LIST
foreach($queryResult as $result){
    echo $result->nodeValue;
}
# Yes