在XML中提取一个值


pulling out one value in XML

我是PHP 中处理和读取XML字符串的新手

我有像这个一样的XML

<sports-metadata>
  <sports-content-codes>
    <sports-content-code code-type="sport" code-key="15027000" code-name="Golf"/>
    <sports-content-code code-type="league" code-key="l.pga.com" code-name="Professional Golf Association"/>
    <sports-content-code code-type="season-type" code-key="regular"/>
    <sports-content-code code-type="season" code-key="2015"/>
    <sports-content-code code-type="priority" code-key="normal"/>
  </sports-content-codes>
</sports-metadata>

我已经通过$xml=simplexml_load_file() 读取了XML

我可以通过$xml->{'sports-content-codes'}->{'sports-content-code'} 访问此XML部分

在体育内容代码

我想访问/检索code-type="season" 所在的代码键值

我如何在PHP中做到这一点?

谢谢大家。

--Ed

通常使用->attributes()方法来获取这些属性:

foreach($xml->{'sports-content-codes'}->{'sports-content-code'} as $content_code) {
    $attr = $content_code->attributes();
    $code_type = (string) $attr->{'code-type'};
    echo $code_type;
}

样本输出

使用Xpath。。。

带有SimpleXml:

$element = simplexml_load_string($xml);
$array = $element->xpath(
  '//sports-content-code[@code-type="season"]'
);
var_dump(
  (string)$array[0]['code-key']
);

或DOM:

$dom = new DOMDocument();
$dom->loadXml($xml);
$xpath = new DOMXpath($dom);
var_dump(
  $xpath->evaluate(
    'string(//sports-content-code[@code-type="season"]/@code-key)'
  )
);

输出(两者):

string(4) "2015"

Xpath是DOM的一种表达式语言(比如DBMS的SQL)。SimpleXMLElement::xpath()支持其中的一些(仅返回元素或属性节点的表达式)。结果将始终是SimpleXMLElement对象的数组。DOMXpath::evaluate()支持完整的Xpath 1.0。结果是DOMNodelist或标量值,具体取决于表达式。

表达式:

选择"体育内容代码"元素节点

//sports-content-code

具有"代码类型"属性的节点是季节

//sports-content-code[@code-type="season"]

获取"代码键"属性节点

//sports-content-code[@code-type="season"]/@code-key

将节点列表强制转换为返回第一节点的文本内容的字符串

string(//sports-content-code[@code-type="season"]/@code-key)