【问题标题】:How to prevent white space between XML nodes when traversing it?遍历XML节点时如何防止出现空白?
【发布时间】:2013-06-07 10:13:02
【问题描述】:

这与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() in

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

$node->nodeType == 1

在某些情况下,它可以正常工作,但在某些情况下,它总是显示错误,如已说明的那样。我知道它的出现是因为节点之间有一些white space。但是在读取 XML 文件时还有其他方法可以忽略这些空白吗?因为我已经写了这么多代码,所以如果有一些精确的解决方案。

我使用 DomDocument 对象来完成这一切。

我们将不胜感激。

【问题讨论】:

  • 您可以发布您当前使用的产生上述错误的代码吗?
  • @Prix,感谢您对问题中相关标签的快速响应和编辑。请找到有问题的附加代码。
  • @NullVoid 你有机会改成$nodeList=$items-&gt;getElementsByTagName("item");吗?
  • @NullVoid 你试过用$xmldoc-&gt;preserveWhiteSpace = false;
  • @Passerby,实际上我加载了整个文件并使用 DomDocument 获取后代元素,然后根据元素的层次结构使用 nextSiblingpreviousSibling 遍历它们。所以我不能使用你提供的建议:(

标签: php xml-parsing domdocument


【解决方案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;
}

【讨论】:

  • 感谢您的解决方案,但我已经有一个 API 可以处理所有与 XML 相关的操作。所以我无法实施上述解决方案:(
  • @NullVoid 你不必实现我的,但你可以作为参考来找出你的 inst 工作的原因。从外观上看,错误出在某个节点失败而不是您的结构中。
  • @NullVoid 或者您可以发布您的 API 的工作版本,我们可以使用它来调试并找出可能破坏它的原因。
  • @NullVoid 是的,很抱歉,上面的代码是基于您可以/向我展示的内容,从您向我展示的内容来看,我没有看到任何问题,所以也许您正在遍历某些破坏它的东西这就是为什么您收到错误消息而没有看到更多信息的原因,我只是无法调试它会是什么。问题可能出在您的 while 函数中,但是使用这么少的代码将很难确定。看看这个,也许这对你也有帮助:stackoverflow.com/questions/6356115/traverse-the-dom-tree
  • +1 是的。当然。我只是参考您的代码并进行处理。 :( 我刚刚在我的问题中展示了一些示例,我们可以从中了解我在哪里做错了。哦……你是对的。
猜你喜欢
  • 2018-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-19
  • 2013-03-28
  • 1970-01-01
相关资源
最近更新 更多