0

我想从 XML 文件中读取嵌套元素和每个元素的属性值。我正在使用 simpleXML,到目前为止,这是我的代码:

$path = Mage::getBaseUrl('media').'Banners/data.xml' ;
$doc = new DOMDocument();
$doc->load( $path );

$items = $doc->getElementsByTagName( "imgitem" );
$xml=simplexml_load_file($path);

foreach($xml->children() as $child)
{
  foreach( $child as $item )
    {
        $attr = $xml->imgitem->attributes();
        echo $attr['image'].'<br>';
        echo $attr['link'].'<br>';
        echo $attr['target'].'<br>';            

    }
}

谁能指出我正确的方向以便递归地获取所有子节点及其属性?

这是源 XML 文件结构

<Banner> 
<imgitem image="img/source/path" link="" target="_blank" delay="" textBlend="yes"> <![CDATA[Autumn Leaves]]> </imgitem> 
<imgitem image="img/source/path" link="" target="_blank" delay="" textBlend="yes"> <![CDATA[Creek]]> </imgitem> 
<imgitem image="img/source/path" link="" target="_blank" delay="" textBlend="yes"> <![CDATA[Dock]]> </imgitem> 
</Banner>

现在我想要的是父标签的三个项目中每个项目的所有属性的值。因此需要遍历主标签以获取所有三个(或任意数量)项目,然后再进行另一个循环并获取每个项目的所有属性值。

4

3 回答 3

2

正在寻找类似的解决方案,以在大型 xml 文档中递归查找所有子节点直至无限。这对我有用:

 $xmlIterator = new RecursiveIteratorIterator(
    new SimpleXMLIterator($xml_string), 
    RecursiveIteratorIterator::SELF_FIRST
 );
 foreach ($xmlIterator as $nodeName => $node) {
   echo "<br>" . $nodeName, $node['attribute'], PHP_EOL;
 }
于 2015-08-13T08:53:05.883 回答
1

感谢您澄清问题。我认为你在这里过于复杂了——这里不需要递归,你甚至可能不需要一个以上的循环。

您已经拥有了foreach($xml->children() as $child)- 这将<imgitem>依次为您提供 as $child,因为它们是顶级项目的子项。您可以等效地说foreach($xml->imgitem as $child),这将跳过任何不是<imgitem>标签的孩子。

要回显这些元素的属性,您只需要说$child['someAttributeName']- 因此您在示例中的代码将如下所示:

$path = Mage::getBaseUrl('media').'Banners/data.xml' ;
$xml = simplexml_load_file($path);

foreach($xml->children() as $child)
{
    echo $child['image'].'<br>';
    echo $child['link'].'<br>';
    echo $child['target'].'<br>';           
}

如果您出于某种原因想要依次循环遍历每个属性,而不是引用特定属性,那么您只需要在内部再循环一个:

foreach($xml->children() as $child)
{
    foreach($child->attributes() as $attr_name => $attr_value)
    {
        echo "Attribute '$attr_name' has value '$attr_value'";
    }
}
于 2013-07-05T19:33:20.407 回答
0

如果您在 ; 之前添加第二个 ),则此示例有效。在第一行代码中。它列出了 XML 文件根目录中的所有节点及其所有子节点。

$xmlIterator = new RecursiveIteratorIterator(new SimpleXMLIterator($xmlstring,RecursiveIteratorIterator::SELF_FIRST));
foreach ($xmlIterator as $nodeName => $node)
{
    echo "<br>" . $nodeName, $node['value'], PHP_EOL;
}
于 2020-07-29T13:54:48.833 回答