1

我有一个带有以下示例内容的大型 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 对象。在foreach中生成了ItemId,但是是正确的。

为什么这在小例子中有效,但在大文件中却找不到任何东西?

我尝试了其他几个版本:

$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()';

等等……他们都没有找到它

4

3 回答 3

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,但问题似乎出在“价值”位上。您的 XPath 在value不使用时会返回正确的内容。

这对我有用:(当然,在访问数组索引之前我没有添加任何完整性检查)

<?php

$path = '//item[@id="'.$itemId.'"]/property[@name="realtycompany"]';
$company = (string)$xml->xpath($path)[0]->value;
print_r($company);
于 2013-04-15T10:28:13.633 回答
2

您正在使用SimpleXML 扩展及其SimpleXMLElement::xpath()方法专门运行 xpath 查询。

但是SimpleXMLElement xpath 查询不能返回文本节点 ( text())。在您的情况下,即使您text()在 xpath 查询的末尾编写,它也会返回文本父元素节点。

由于这是 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* 所示,您从评估调用中获得了一个字符串,因为 xpath 查询查询了一个字符串(text()最后您将获得一个DOMText节点,这是 Simplexml 无法表示的)。

于 2013-04-15T10:48:10.607 回答
0

如果您只想访问元素的值,则使用Simple HTML DOM可能更容易

include('simple_html_dom.php');
$xml = file_get_html('file.xml');
$value = $html->find('property[name=realtycompany]');
echo $value->plaintext;
于 2013-04-15T10:29:05.900 回答