dongqi9125 2013-02-14 21:33
浏览 110
已采纳

为什么这个xmlreader代码不起作用?

I have a file that looks like this:

    <ExternalPage about="http://animation.about.com/">
       <d:Title>About.com: Animation Guide</d:Title>
       <d:Description>Keep up with developments in online animation for all skill levels.     Download tools, and seek inspiration from online work.</d:Description>
       <topic>Top/Arts/Animation</topic>
    </ExternalPage>
    <ExternalPage about="http://www.toonhound.com/">
       <d:Title>Toonhound</d:Title>
       <d:Description>British cartoon, animation and comic strip creations - links, reviews  and news from the UK.</d:Description>
       <topic>Top/Arts/Animation</topic>
    </ExternalPage>

etc.

I'm trying to get the "about" url, as well as the nested title and description. I've tried the following code, but all I get is a bunch of dashes...

$reader = new XMLReader();

if (!$reader->open("dbpedia/links/xml.xml")) {
die("Failed to open 'xml.xml'");
}
$num=0;
while($reader->read() && $num<200) {
if ($reader->nodeType == XMLReader::ELEMENT && $reader->name == 'ExternalPage') {
$url = $reader->getAttribute('about');

while ($xml->nodeType !== XMLReader::END_ELEMENT ){
$reader->read();

 if ($reader->nodeType == XMLReader::ELEMENT && $reader->name == 'd:Title') {
 $title=$xmlReader->value;
 }
elseif ($reader->nodeType == XMLReader::ELEMENT && $reader->name == 'd:Description') {
$desc=$xmlReader->value;
}
}

}
$num++;echo $url."-".$title."-".$desc."<br />";
}
$reader->close();

I'm new at xmlreader, so I'd appreciate it if someone can figure out what I'm doing wrong.

Note: I'm using xmlreader because the file is a huge one (millions of lines).

EDIT: The beginning of the file looks like this:

<?xml version="1.0" encoding="UTF-8"?>
<RDF xmlns:r="http://www.w3.org/TR/RDF/" xmlns:d="http://purl.org/dc/elements/1.0/"       xmlns="http://dmoz.org/rdf/">
  <!-- Generated at 2013-02-10 00:03:45 EST from DMOZ 2.0 -->
  <Topic r:id="">
<catid>1</catid>
  </Topic>
<Topic r:id="Top/Arts">
    <catid>381773</catid>
  </Topic>
  <Topic r:id="Top/Arts/Animation">
  <catid>423945</catid>
<link1 r:resource="http://www.awn.com/"></link1>
<link r:resource="http://animation.about.com/"></link>
<link r:resource="http://www.toonhound.com/"></link>
<link r:resource="http://enculturation.gmu.edu/2_1/pisters.html"></link>
<link r:resource="http://www.digitalmediafx.com/Features/animationhistory.html"></link>
<link r:resource="http://www.spark-online.com/august00/media/romano.html"></link>
<link r:resource="http://www.animated-divots.net/"></link>
</Topic>
<ExternalPage about="http://www.awn.com/">
<d:Title>Animation World Network</d:Title>
<d:Description>Provides information resources to the international animation community. Features include searchable database archives, monthly magazine, web animation guide, the Animation Village, discussion forums and other useful resources.</d:Description>
<priority>1</priority>
<topic>Top/Arts/Animation</topic>
</ExternalPage>

etc

  • 写回答

3条回答 默认 最新

  • drnf593779 2013-02-14 22:18
    关注

    It'll take time and proper debugging to come up with working pure XMLReader code. Meanwhile try this hybrid method:

    $xmlR = new XMLReader;
    $xmlR->open('dbpedia/links/xml.xml');
    
    //Skip until <ExternalPage> node
    while ($xmlR->read() && $xmlR->name !== 'ExternalPage');
    
    $loadedNS_f = false;
    while ($xmlR->name === 'ExternalPage')
    {
        //Read the entire parent tag with children
        $sxmlNode = new SimpleXMLElement($xmlR->readOuterXML());
    
        //collect all namespaces in node recursively once; assuming all nodes are similar
        if (!$loadedNS_f) {
            $tagNS = $sxmlNode->getNamespaces(true);
            $loadedNS_f = true; 
        }
        $URL = (string) $sxmlNode['about'];
        $dNS = $sxmlNode->children($tagNS['d']);
        $Title = (string) $dNS->Title;
        $Desc = (string) $dNS->Description;
        $Topic = (string)$sxmlNode->topic;
    
        var_dump($URL, $Title, $Desc, $Topic);
    
        // Jump to next <ExternalPage> tag
        $xmlR->next('ExternalPage');
    }
    
    $xmlR->close();
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 救!ENVI5.6深度学习初始化模型报错怎么办?
  • ¥30 eclipse开启服务后,网页无法打开
  • ¥30 雷达辐射源信号参考模型
  • ¥15 html+css+js如何实现这样子的效果?
  • ¥15 STM32单片机自主设计
  • ¥15 如何在node.js中或者java中给wav格式的音频编码成sil格式呢
  • ¥15 不小心不正规的开发公司导致不给我们y码,
  • ¥15 我的代码无法在vc++中运行呀,错误很多
  • ¥50 求一个win系统下运行的可自动抓取arm64架构deb安装包和其依赖包的软件。
  • ¥60 fail to initialize keyboard hotkeys through kernel.0000000000