如何在遍历XML节点时防止XML节点之间出现空白?

时间:2013-06-07 10:13:02

标签: php xml-parsing domdocument

这与PHP Dom Document有关。

我有以下示例文件

<?xml version="1.0" encoding="UTF-8"?>
<document>
    <items>
        <item class="pen">
            <no>1</no>
            <name>A</name>
            <price>10</price>
        </item>
        <item class="book">
            <no>2</no>
            <name>B</name>
            <price>20</price>
        </item>
        <item class="pen">
            <no>2</no>
            <name>C</name>
            <price>30</price>
        </item>
    </items>
</document>

PHP代码

$nodeCount = $oElement;
$limitCount = 1;
$nodeCount = $nodeCount->nextSibling;
while($nodeCount && !empty($nodeCount) && $nodeCount->nodeType == 1 && !preg_match("/pen/",$this->GetNodeClass($nodeCount)))
{
    $limitCount++;
    $nodeCount = $nodeCount->nextSibling;
}

此处,GetNodeClass()检查属性class,这是发生错误的罪魁祸首点

function GetNodeClass($oElement)
{
    //Error comes from below line when try to execute getAttribute() method on TextNode
    $class = $oElement->getAttribute('class');
    return $class;
}

当我遍历这些元素时,有时会收到如下错误

  

致命错误:在

中调用未定义的方法DOMText :: getAttribute()

然后我尝试使用以下条件解决它以防止该错误。

$node->nodeType == 1

在某些情况下,它可以正常工作,但在某些情况下,它总是显示错误,如解释。我知道这是因为节点之间有一些white space。但有没有其他方法可以在XML文件读取时忽略这些空格?因为我已经写了很多代码,所以如果有针对性的解决方案。

我使用DomDocument对象。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

我刚刚编写了一个非常简单的代码,试图重现您的错误,但我无法在下面跟随代码,它对我来说没问题。

<?php

$dom = new DOMDocument;
$dom->preserveWhiteSpace = FALSE;
$dom->load('data.xml');

foreach ($dom->getElementsByTagName('item') as $item)
{
        if (!preg_match("/pen/",GetNodeClass($item)))
        #if ($item->getAttribute('class') == 'book')
        {
                        echo "no." . $item->childNodes->item(0)->nodeValue . "\n";
                        echo "Name: " . $item->childNodes->item(1)->nodeValue . "\n";
                        echo "Price: " . $item->childNodes->item(2)->nodeValue . "\n";
                        echo "----------------------------\n";
        }
}

function GetNodeClass($oElement)
{
    $class = $oElement->getAttribute('class');
    return $class;
}