我有一个大型xml文件,其中包含以下示例内容:
<transferData version="1.0">
<item id="1885880" itemType="kivihomepagetransfer">
<property name="country_id">
<value>4402</value>
</property>
<property name="rc_maintenance_other"></property>
<property name="claim_right_shareholder"></property>
<property name="charges_other"></property>
<property name="investment_flag"></property>
<property name="rc_repair_need"></property>
<property name="realtycompany">
<value>Asunto Oy Aulangtie 20</value>
</property>
我已经将在线生成器用于xpath
http://www.xmltoolbox.com/index.html
我想访问<property name="realtycompany">
的值,我的xpath调用如下所示:
$path = '//item[@id="'.$itemId.'"]/property[@name="realtycompany"]/value/text()';
$company = $xml->xpath($path);
print_r($company);
在在线生成器中,这是有效的,但原始的xml没有。我只是简单地接收SimpleXMLElement对象。 ItemId是在foreach中生成的,但它是正确的。
为什么这个小例子工作,但是大文件找不到任何东西?
我尝试了其他几个版本:
$path = '//item[@id="'.$itemId.'"]/property[@name="realtycompany"]/value';
$path = '//item[@id="1885880"]/property[@name="realtycompany"]/value/text()';
$path = '/item[@id="'.$itemId.'"]/property[@name="realtycompany"]/value/text()';
$path = '/transferData[@version="1.0"]/item[@id="'.$itemId.'"]/property[@name="realtycompany"]/value/text()';
依旧......他们都没有找到它
答案 0 :(得分:2)
编辑:我发现了问题。您的XPath正在运行,但var_dump / print_r没有显示任何有用的内容。请尝试以下方法:
$path = '//item[@id="'.$itemId.'"]/property[@name="realtycompany"]/value/text()';
$company = $xml->xpath($path)[0];
print_r((string)$company);
早期回复
我没有多少使用XPath,但问题似乎是'value'位。
value时,您的XPath会返回正确的内容。这对我有用:(当然,在访问数组索引之前我没有添加任何健全性检查)
<?php
$path = '//item[@id="'.$itemId.'"]/property[@name="realtycompany"]';
$company = (string)$xml->xpath($path)[0]->value;
print_r($company);
答案 1 :(得分:1)
您正在使用 SimpleXML 扩展名及其SimpleXMLElement::xpath()
方法专门用于运行xpath查询。
但 SimpleXMLElement xpath查询无法返回文本节点(text()
)。在您的情况下,即使您在xpath查询结束时编写text()
,它也将返回文本父元素节点。
由于这是SimpleXML,您只需将其强制转换为字符串/在字符串上下文中使用它:
list($company) = $xml->xpath($path);
# echo is string context and output is: "Asunto Oy Aulangtie 20"
echo "Value: ", $company, "\n";
如果要直接从文档中检索文本值作为字符串,可以将其导入 DOMXPath 并进行评估:
$path = 'string(//item[@id="'.$itemId.'"]/property[@name="realtycompany"]/value)';
$xpath = new DOMXPath(dom_import_simplexml($xml)->ownerDocument);
var_dump($xpath->evaluate($path)); # string(22) "Asunto Oy Aulangtie 20"
由于* var_dump *显示您从 evaluate 调用返回一个字符串,因为xpath查询查询字符串(最后使用 text()
会得到一个 DOMText 节点,这是Simplexml无法表示的。)
答案 2 :(得分:0)
如果您要访问的是元素的值,则可能更容易使用Simple HTML DOM
include('simple_html_dom.php');
$xml = file_get_html('file.xml');
$value = $html->find('property[name=realtycompany]');
echo $value->plaintext;