我正在尝试提取<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
答案 0 :(得分:2)
用于选择属性节点的有效XPath表达式应如下所示:
.then()
答案 1 :(得分:1)
您在此处混合使用SimpleXML和DOM。此外,表达式提取具有PersonDetails
属性的RecordDate
元素。 []
是条件。
因此,要获取属性节点,您需要使用//PersonDetails/@RecordDate
。在SimpleXML中,这将为非现有元素节点创建SimpleXMLElement,如果强制转换为字符串,它将返回属性值。 SimpleXMLElement :: xpath()将始终返回一个数组,因此您需要将该数组的第一个元素转换为字符串。
$theDate = (string)$XML->xpath("//PersonDetails/@RecordDate")[0];
$textContent
是DOM节点的属性。它包含所有后代节点的文本内容。但在这种情况下你不需要它。如果使用DOMXpath::evaluate()
,则Xpath表达式可以直接返回字符串值。
$document = new DOMDocument();
$document->loadXml($xmlString);
$xpath = new DOMXpath($document);
$theDate = $xpath->evaluate('string(//PersonDetails/@RecordDate)');
字符串类型转换被移入Xpath表达式。