【问题标题】:Parsing XML using XMLReader + SimpleXML in PHP在 PHP 中使用 XMLReader + SimpleXML 解析 XML
【发布时间】:2013-01-23 03:05:51
【问题描述】:

最近我从here 得到关于如何在 PHP 中使用 XMLReader 和 SimpleXML 解析大型 xml 文件的信息。我试图将上述教程的代码改编成我的 php 程序,如下所示:

$xml_url = "http://localhost/rest/server.php?wstoken=".$token&function=contents";
    $reader = new XMLReader;
    $reader->open($xml_url);

    while($reader->read()){
        if($reader->nodeType == XMLReader::ELEMENT && $reader->name == 'SINGLE'){
            $doc = new DOMDocument('1.0','UTF-8');
            $xml = simplexml_import_dom($doc->importNode($reader->expand(), true));
            //$titleString = (string) $xml->description;
            echo $xml->description;
        }
    }

通过url调用的xml文件是这样的(xml版本是here):

其他 SINGLE 标签(标有“红色”)具有相同的结构,我也想打印它们的“描述”。

上面提到的php程序的输出是:第1行第1列的错误:文档末尾的额外内容。任何帮助都会很棒。

【问题讨论】:

  • 你不能简单地使用simplexml_load_file和xpath吗?

标签: php xml-parsing simplexml xmlreader


【解决方案1】:

SimpleXML函数应该够用了:

$xml=simplexml_load_file('http://dl.dropbox.com/u/72519118/response.xml');
var_dump($xml->xpath('//SINGLE/KEY[@name="description"]/VALUE/text()'));

以上var_dump输出:

array(3) {
  [0]=>
  object(SimpleXMLElement)#2 (1) {
    [0]=>
    string(1703) "<div class="no-overflow">..."
  }
  [1]=>
  object(SimpleXMLElement)#3 (1) {
    [0]=>
    string(9906) "<div class="no-overflow">..."
  }
  [2]=>
  object(SimpleXMLElement)#4 (1) {
    [0]=>
    string(4114) "<div class="no-overflow">..."
  }
}

注意xpath() 中的标签名称区分大小写,因此'//single/key...' 不起作用。

加法

在 SimpleXML 中检索文本值的“标准”方式是$KEY-&gt;VALUE

但是,如果您已到达 XML 树的“结束”节点(就像我在 XPath 中所做的那样),您可以简单地将其类型转换为字符串以获取值:

$xml=simplexml_load_file('http://dl.dropbox.com/u/72519118/response.xml');
$result=$xml->xpath('//SINGLE/KEY[@name="description"]/VALUE/text()');
foreach($result as $text)
{
    var_dump((string)$text);
}

以上输出:

string(1703) "<div class="no-overflow"><p>..."
string(9906) "<div class="no-overflow"><h3>..."
string(4114) "<div class="no-overflow"><h3>..."

【讨论】:

  • 谢谢你的回复,我用过,但现在结果是:第1行第1列错误:文档为空
  • @Dozent 我再次尝试了这段代码,仍然得到相同的结果。您确定您的 server.php 生成的有效 XML 与您在 DropBox 上发布的相同吗?
  • 是的,现在可以了,我错误地把 Content-type: application/xml 而不是 text/html。现在的结果是:array(15) { [0]=> object(SimpleXMLElement)#2 (0) { } [1]=> object(SimpleXMLElement)#3 (0) { } [2]=> object(SimpleXMLElement )#4 (0) { ... 老实说,我不知道如何从这组数组中提取值。你能告诉我方法吗?谢谢
  • @Dozent 更新了我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多