使用PHP for循环显示来自大型外部XML提要的重复节点

使用PHP for循环显示来自大型外部XML提要的重复节点,php,xml,simplexml,domdocument,Php,Xml,Simplexml,Domdocument,我已经研究这个问题一周左右了,还没有在已经存在的问题中找到任何信息来解决问题。我从一家公司(这是一个MITS提要)中提取了一个非常大的XML文件,该文件的输出很容易超过一百万行。很遗憾,由于法律原因,我无法给出此文件的位置,但我将解释我正在尝试做什么,也许你们都可以帮助我解决此问题 我打电话给你的文件是这样的: <?php $xml=simplexml_load_file("location-of-file/feed.xml"); ?> ( [@attributes]=>数组

我已经研究这个问题一周左右了,还没有在已经存在的问题中找到任何信息来解决问题。我从一家公司(这是一个MITS提要)中提取了一个非常大的XML文件,该文件的输出很容易超过一百万行。很遗憾,由于法律原因,我无法给出此文件的位置,但我将解释我正在尝试做什么,也许你们都可以帮助我解决此问题

我打电话给你的文件是这样的:

<?php 

$xml=simplexml_load_file("location-of-file/feed.xml");

?>
( [@attributes]=>数组 ( [IDValue]=>56bce392-b9fb-4290-97bc-900b9ebf9a1e )


)

尝试使用

echo '<pre>';
print_r($feed);
echo '</pre>';
echo';
打印(feed);
回声';

这将为您提供一个更“漂亮”的方案视图,以及哪些节点是/不可访问的

我推荐类似的东西:

$test = $item->WebSite;
//do something to $test
$xml->$key->WebSite = $test;
但是请注意,$item是数组$xml的副本,因此要操作此对象,需要将$item更改为&$item,或者需要在循环中操作实际值

header("Content-Type: application/xml; charset=utf-8");
$xml = simplexml_load_file("test.xml", null, LIBXML_NOCDATA);
$values = array("Belgian Waffles","French Toast");
$new = new SimpleXMLElement("<tester></tester>");
foreach($xml->food as $item){
    if(in_array($item->name,$values)){
        $type = $new->addChild('type');
        $movie = $type->addChild('movie');
        $movie->addChild('price', $item->price);
    }else{
    }
}
echo $new->asXML();
但是,如果您正在构建一个新的array/xml文档,则不必担心这个问题

更新:

我已经在一个示例提要上对此进行了测试,您应该能够通过一些编辑来完成这项工作

标题(“内容类型:application/xml;charset=utf-8”);
$xml=simplexml\u load\u文件(“test.xml”,null,LIBXML\u NOCDATA);
$values=数组(“比利时华夫饼”、“法国土司”);
$new=新的SimpleXMLElement(“”);
foreach($xml->food as$item){
if(在数组中($item->name,$values)){
$type=$new->addChild('type');
$movie=$type->addChild('movie');
$movie->addChild('price',$item->price);
}否则{
}
}
echo$new->asXML();
基本上,在之前给出它,编辑它以使用正确的节点,并为您构建正确的提要,然后这应该可以工作。asXML()有一个可选参数,您可以传入以写入文件
所以改变
echo$new->asXML()
$new->asXML(“test.xml”)将改为将文件写入test.xml,而不是输出数据。如果确实保存了它,请确保去掉
标题(“内容类型:application/xml;charset=utf-8”)

什么意思?你运气不好?我无法从SimpleXML元素中的特定节点获取所需的数据。(我是一个RoR开发人员,因此调整PHP语法可能也是一个很大的绊脚石——我确信我的问题有点愚蠢)您是否使用了下面的方法来解决这个问题,我很快就会回来更新。谢谢你的指导,利亚姆。没问题,我不确定链接是否真的有用,尽管我认为我误读了它。这确实创造了一个更“快乐”的方案和节点视图!非常感谢。通过循环显示此信息是否算作操作?不幸的是,我不得不从direct feed中提取数据,因为它每30分钟更新一次,构建一个新的XML文档是没有意义的(对我来说-如果这有价值,请纠正我,我在这里学习)。@NoahNathaniel DanielDavis这完全取决于你是否只想显示某些节点,如果这样做,则需要从XML提要构建。但是,如果是整个提要,您也可以使用获取数据,因为这样每次都会提取数据。更好的方法是使用php文件创建xml文档,使用file_get_contents并每30分钟运行一次cron作业来创建一个新的xml文件。我只想获取“property”节点,更具体地说,只获取与特定字符串列表相匹配的“propertyid->identification->organizationname”的“property”节点(或组织名称)我仍然没有取得任何成功:(@NoahNathaniel DanielDavis我已经更新了底部的答案,试试看嘿,Liam,我现在正在尝试。如果我在接下来的一个小时左右找不到成功的机会,有没有可能让你签署保密协议并雇用你做一份短期的自由职业者工作?
echo '<pre>';
print_r($feed);
echo '</pre>';
$xml = simplexml_load_file("location-of-file/feed.xml", null, LIBXML_NOCDATA);

foreach($xml as $key => $item){
  // to select an element do something like this
  $item->WebSite;
}
$test = $item->WebSite;
//do something to $test
$xml->$key->WebSite = $test;
header("Content-Type: application/xml; charset=utf-8");
$xml = simplexml_load_file("test.xml", null, LIBXML_NOCDATA);
$values = array("Belgian Waffles","French Toast");
$new = new SimpleXMLElement("<tester></tester>");
foreach($xml->food as $item){
    if(in_array($item->name,$values)){
        $type = $new->addChild('type');
        $movie = $type->addChild('movie');
        $movie->addChild('price', $item->price);
    }else{
    }
}
echo $new->asXML();