3

我遇到的问题是我的 xml 文件的某些节点被正确解析和显示,而其他节点没有被检测到(至少我不知道这里出了什么问题)

我将提供一个指向它的链接,而不是发布 xml 文件。这是一个小的 XML 片段,供您查看 xml 结构:

<offers version="1"><group name="games">
    <o id="1" url="http://inexus.us/world-of-warcraft-eu/pre-paid-game-time-card-60-days" price="21.53" avail="1">
        <name>World of Warcraft EU Pre-Paid Game Time Card 60 Days</name>
        <currency>
            EUR
        </currency>
    </o>

现在,我正在使用此代码来解析/读取 xml 文件。

$xmlDOM = new DOMDocument();
$xmlDOM->load("http://inexus.us/compare.xml");
$document = $xmlDOM->documentElement;
foreach ($document->childNodes as $node) {
    if ($node->hasChildNodes()) {
        foreach($node->childNodes as $temp) {
            echo $temp->nodeName."=".$temp->nodeValue."<br />";

        }
    }
}

使用该代码,我得到了name每个 elemeto 但是我还需要获取存储在o元素内的信息......(即id, url, price)但我不太明白如何访问它们。

输出还返回几个#text=块。(我猜这是因为 xml 中的空格而发生的?)

一小段输出:

#text=
#text=
o= World of Warcraft EU Pre-Paid Game Time Card 60 Days EUR
#text=
o= World of Warcraft EU Battle Chest cd-key EUR
#text=
o= World of Warcraft EU Cataclysm cd-key EUR
#text= 

任何帮助/提示表示赞赏!

4

3 回答 3

2

#text必须处理空格。你可以使用preserveWhiteSpace = false(见下文),但你必须记住在你之前使用它load()

至于属性,您可以使用hasAttributes()来检查节点是否具有属性,然后使用 遍历节点的属性attributes

在下面的示例中,我采用了快捷方式并抓取了所有o标签:

<?php
$xmlDOM = new DOMDocument();
$xmlDOM->preserveWhiteSpace = false;
$xmlDOM->load("http://inexus.us/compare.xml");
$offers = $xmlDOM->getElementsByTagName('o');
foreach ($offers as $offer) {
    if($offer->hasAttributes()){
        foreach($offer->attributes as $attr){
            $name = $attr->nodeName;
            $value = $attr->nodeValue;
            echo $name.' = '.$value.'<br>';
        }
    }
    if ($offer->hasChildNodes()) {

        foreach($offer->childNodes as $o) {
            echo $o->nodeName."=".$o->nodeValue."<br />";

        }
    }
    echo '<hr>';
}?>
于 2013-03-08T15:23:21.950 回答
1

检查文档以获取您可以在DOMNode. 对于您的问题:

  1. 检查 的attributes属性$temp以访问其所有属性。它是 a DOMNamedNodeMap,因此您可以(例如)访问它们,例如:

    foreach ($temp->attributes as $name => $attrNode) {
        echo $name."=".$attrNode."<br />";
    }
    
  2. 您可以通过在将其包含在结果中之前对其进行测试来消除不需要的Text节点。nodeTypeXML_ELEMENT_NODE

于 2013-03-08T15:16:38.237 回答
1

对于这样的 XML 文档,在SimpleXML中处理它通常更容易。通常,您要查找的内容称为attributes。除了 作为元素子元素的文本值之外,元素还具有属性

SimpleXML中,访问相当直接:访问元素的属性是使用数组表示法和字符串键:

$game['id']; # id attribute of $game (here the <o> element)

要访问一个孩子(通常只有一个孩子,比如<name>),您可以通过它的 child-element-name 访问它:

$game->name; # (first) name child element of $game

如果您在字符串上下文中使用它(例如,作为字符串参数;echo或强制转换(string) $game->name),它不会返回元素,而是返回内部文本值。

这是一些示例代码(也使用简单的xpath):

$url = 'http://inexus.us/compare.xml';
$xml = simplexml_load_file($url);

foreach($xml->xpath('/*/group/o') as $index => $game)
{
    printf("[%04d] %' -48s  %' 5s %s\n       <%s>\n",
        $game['id'],            # id attribute
        trim($game->name),      # name child text value
        $game['price'],         # price attribute
        trim($game->currency),  # currency child text value
        $game['url']            # url attribute
    );
}

这是输出:

[0001] World of Warcraft EU Pre-Paid Game Time Card 60 Days  21.43 EUR
       <http://inexus.us/world-of-warcraft-eu/pre-paid-game-time-card-60-days>
[0003] World of Warcraft EU Battle Chest cd-key          10.31 EUR
       <http://inexus.us/world-of-warcraft-eu/battle-chest-cd-key>
[0668] World of Warcraft EU Cataclysm cd-key              6.18 EUR
       <http://inexus.us/world-of-warcraft-eu/cataclysm-cd-key>
[0954] World of Warcraft EU Mists of Pandaria cd-key     18.80 EUR
       <http://inexus.us/world-of-warcraft-eu/mists-of-pandaria-cd-key>
[0988] World of Warcraft EU Battle Chest + Cataclysm cd-key  15.48 EUR
       <http://inexus.us/world-of-warcraft-eu/battle-chest-cataclysm-cd-key>
[0018] Eve Online Pre-Paid Card 60 Days Special Edition  28.40 EUR
       <http://inexus.us/eve-online/pre-paid-card-60-days-special-edition>
[0766] Eve Online +30 Days cd-key                        11.60 EUR
       <http://inexus.us/eve-online/30-days-cd-key>
[1057] Eve Online Pre-Paid Card 60 Days                  25.82 EUR
       <http://inexus.us/eve-online/pre-paid-card-60-days>
[0029] Sony Online Pre-Paid 30 days EU                   14.19 EUR
       <http://inexus.us/sony-online/pre-paid-30-days-eu>
...

演示

于 2013-03-08T16:37:06.637 回答