Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP SimpleXML-xpath不起作用,但在联机生成器中起作用_Php_Xml_Xpath_Simplexml - Fatal编程技术网

PHP SimpleXML-xpath不起作用,但在联机生成器中起作用

PHP SimpleXML-xpath不起作用,但在联机生成器中起作用,php,xml,xpath,simplexml,Php,Xml,Xpath,Simplexml,我有一个包含以下示例内容的大型xml文件: <transferData version="1.0"> <item id="1885880" itemType="kivihomepagetransfer"> <property name="country_id"> <value>4402</value> </property> <property name="rc_maintenance_other"></p

我有一个包含以下示例内容的大型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>
在联机生成器中,这是可行的,但与原始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()';

等等。。。没有人找到它编辑:我解决了问题。您的XPath正在工作,但是var\u dump/print\r没有向您显示任何有用的内容。请尝试以下操作:

$path = '//item[@id="'.$itemId.'"]/property[@name="realtycompany"]/value/text()';
$company = $xml->xpath($path)[0];
print_r((string)$company);

早期反应

我没有太多使用XPath,但问题似乎在于“值”位。如果未使用
,XPath将返回正确的内容

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

xpath($path)[0]->值;
印刷公司;

如果您只想访问元素的值,那么使用

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

但是,SimpleXMLElement xpath查询无法返回文本节点(
text()
)。在您的例子中,即使您在xpath查询的末尾编写
text()
,它也会返回text父元素节点

由于这是SimpleXML,您只需将其转换为字符串/在字符串上下文中使用它:

list($company) = $xml->xpath($path);

# echo is string context and output is: "Asunto Oy Aulangtie 20"
echo "Value: ", $company, "\n";  
如果要直接从文档中检索字符串形式的文本值,可以将其导入DOMPATH并计算:

$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()
您将获得一个DOMTEXL节点,这是Simplexml无法表示的)。

如果删除
test()
有效,谢谢。是的,我已经在没有text()的情况下尝试过了,但还是一样,对象是空的。我已经在下面编辑了我的答案。您的XPath正在工作,但var\u dump/print\r没有意义地显示其内容。不要在SimpleXmlElement上使用
print\r
,请使用
$element->asXML('php://output');,它显示了它返回的内容。我不喜欢它,他加载的是XML而不是HTML,使用HTML解析器可能会导致奇怪的错误bugs@EaterOfCorpses他可能会喜欢。我将其用于XML和HTML,文档类型实际上并不重要。它的使用比PHP的XML解析器简单得多。但我的观点是,他可能会遇到奇怪的错误或意外的行为,比如
  • 元素,他无法生成类似
  • 的代码:D
  • :(
  • 这在HTML中会失败,因为如果一个li接着一个li,它就必须结束另一个li,你怎么看
    ?HTML中的异常太多了!谢谢!它很有效。你能解释一下为什么在
    $company=$xml->xpath($path)[0]中使用
    [0]
    ?这对我来说太新了,我必须用这个xml构建一个大的cataloque,所以需要很多信息!因为您是按@name搜索的,所以可能会有多个结果。因此,返回一个数组。在您的情况下,是一个包含一个元素的数组。请注意,这段代码在PHP
    5.3
    及更低版本中会失败,请改用它e
    $companys=$xml->xpath($path);$company=(字符串)$companys[0]->value;
    include('simple_html_dom.php');
    $xml = file_get_html('file.xml');
    $value = $html->find('property[name=realtycompany]');
    echo $value->plaintext;
    
    list($company) = $xml->xpath($path);
    
    # echo is string context and output is: "Asunto Oy Aulangtie 20"
    echo "Value: ", $company, "\n";  
    
    $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"