Xpath访问XML标记中的属性值

时间:2017-06-10 06:25:31

标签: php xml xpath simplexml

我正在尝试提取<PersonDetails>标记中保存的日期以查找我正在使用的某些XML,例如:

    <Record>
        <PersonDetails RecordDate="2017-03-31T00:00:00">
                <FirstName>Joe</FirstName>
                <Surname>Blogs</Surname>
                <Status>Active</Status>
        </PersonDetails>
    </Record>   

目前我一直在尝试以下方法:

if (isset($XML->Record->xpath("//PersonDetails[@RecordDate]")[0])) {

$theDate = $XML->Record->xpath("//PersonDetails[@RecordDate]")[0])->textContent;

} else {

$theDate = "no date";

}

我的意图是$theDate = 2017-03-31T00:00:00

2 个答案:

答案 0 :(得分:2)

用于选择属性节点的有效XPath表达式应如下所示:

.then()

答案 1 :(得分:1)

您在此处混合使用SimpleXML和DOM。此外,表达式提取具有PersonDetails属性的RecordDate元素。 []是条件。

的SimpleXML

因此,要获取属性节点,您需要使用//PersonDetails/@RecordDate。在SimpleXML中,这将为非现有元素节点创建SimpleXMLElement,如果强制转换为字符串,它将返回属性值。 SimpleXMLElement :: xpath()将始终返回一个数组,因此您需要将该数组的第一个元素转换为字符串。

$theDate = (string)$XML->xpath("//PersonDetails/@RecordDate")[0];

DOM

$textContent是DOM节点的属性。它包含所有后代节点的文本内容。但在这种情况下你不需要它。如果使用DOMXpath::evaluate(),则Xpath表达式可以直接返回字符串值。

$document = new DOMDocument();
$document->loadXml($xmlString);
$xpath = new DOMXpath($document);

$theDate = $xpath->evaluate('string(//PersonDetails/@RecordDate)');

字符串类型转换被移入Xpath表达式。