【问题标题】:Loop through XML-Object in php循环通过 php 中的 XML-Object
【发布时间】:2015-02-23 14:51:11
【问题描述】:

我正在尝试循环访问这样的 xml 对象……

$xml_url = "http://somdomain.com/frieventexport.php";

$curl = curl_init();
curl_setopt( $curl, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt( $curl, CURLOPT_URL, $xml_url );

$xml = curl_exec( $curl );
curl_close( $curl );

$document = new DOMDocument;
$document->loadXML( $xml );

var_dump($document);
//echo $document->childNodes[1];

var_dump 我明白了。

object(DOMDocument)#1 (34) { ["doctype"]=> NULL ["implementation"]=> string(22) "(object value omitted)" ["documentElement"]=> NULL ["actualEncoding"]=> NULL ["encoding"]=> NULL ["xmlEncoding"]=> NULL ["standalone"]=> bool(true) ["xmlStandalone"]=> bool(true) ["version"]=> string(3) "1.0" ["xmlVersion"]=> string(3) "1.0" ["strictErrorChecking"]=> bool(true) ["documentURI"]=> NULL ["config"]=> NULL ["formatOutput"]=> bool(false) ["validateOnParse"]=> bool(false) ["resolveExternals"]=> bool(false) ["preserveWhiteSpace"]=> bool(true) ["recover"]=> bool(false) ["substituteEntities"]=> bool(false) ["nodeName"]=> string(9) "#document" ["nodeValue"]=> NULL ["nodeType"]=> int(9) ["parentNode"]=> NULL ["childNodes"]=> string(22) "(object value omitted)" ["firstChild"]=> NULL ["lastChild"]=> NULL ["previousSibling"]=> NULL ["attributes"]=> NULL ["ownerDocument"]=> NULL ["namespaceURI"]=> NULL ["prefix"]=> string(0) "" ["localName"]=> NULL ["baseURI"]=> NULL ["textContent"]=> string(0) "" }

有人知道如何从中提取信息并使用单个 xml 项吗?

这将在 xml 中:

<event>
<titel>Eventtitle</titel>
<datum>07.03.2015</datum>
<von>18:30</von>
<bis>23:00</bis>
<ort>Something</ort>
<referent>BezRKdo</referent>
<veranstalter>Who does it.</veranstalter>
</event>

我不知道如何遍历这个转储并提取信息。 亲切的问候, 马特

【问题讨论】:

    标签: php xml loops


    【解决方案1】:
    <?php
    
    $xml_url = "http://localhost/site.xml";
    
    $curl = curl_init();
    curl_setopt( $curl, CURLOPT_RETURNTRANSFER, 1 );
    curl_setopt( $curl, CURLOPT_URL, $xml_url );
    
    $xml = curl_exec( $curl );
    curl_close( $curl );
    
    $xml = iconv('UTF-8', 'UTF-8//IGNORE', $xml);
    
    $document = new DOMDocument;
    $document->loadXML( $xml );
    
    $events = $document->getElementsByTagName("event");
    
    foreach( $events as $event ){
        $titels = $event->getElementsByTagName( "titel" );
        $titel= $titels->item(0)->nodeValue;
    
        $datums = $event->getElementsByTagName( "datum" );
        $datum = $datums->item(0)->nodeValue;
    
        echo $titel;
    
    }
    
    
    ?>
    

    【讨论】:

    • 谢谢,但是上面的这个域带有 XML,这应该是动态的。因此,您指出的 $xml 变量不以这种方式存在。查看我的 var_dump() 输出。如果我在 foreach 循环中echo $titel 我没有输出。
    • 另外,如果我把$events = $document-&gt;getElementsByTagName("event"); var_dump($events); 放在循环之外,我会得到这个object(DOMNodeList)#2 (1) { ["length"]=&gt; int(0) }
    • 我给出了XML变量的例子。您必须更改从远程站点获取的 xml。如果你给的网址不是特别的,我可以帮你
    • 不起作用,因为 xml 给出错误“警告:DOMDocument::loadXML() [domdocument.loadxml]:输入不是正确的 UTF-8,指示编码!字节:实体中的 0xDC 0x62 0x75 0x6E,线:3"。我修好了,把你的代码 $xml = iconv('UTF-8', 'UTF-8//IGNORE', $xml);我在上面更新了我的答案
    • 谢谢,请把答案中的实际网址去掉,我试试看。
    【解决方案2】:

    您在 XML 中只有一条记录,每个数据元素都是唯一的。您可以使用 XPath 以字符串形式获取数据。

    $dom = new DOMDocument();
    $dom->loadXml($xml);
    $xpath = new DOMXPath($dom);
    
    echo $xpath->evaluate('string(/event/titel)'), "\n";
    echo $xpath->evaluate('string(/event/datum)'), ' ';
    echo $xpath->evaluate('string(/event/von)'), '-';
    echo $xpath->evaluate('string(/event/bis)');
    

    输出:

    Übung Einhausung Amras
    07.03.2015 18:30-23:00
    

    如果您的 XML 将返回多个事件,您需要循环事件元素并将节点用作上下文:

    多个元素的 XML 结构:

    <events>
      <event>
        <titel>Übung Einhausung Amras</titel>
        ...
      </event>
      <event>
        <titel>Other event</titel>
        ...
      </event>
      ...
    </events>
    

    PHP 遍历 XML 中的多条记录:

    foreach($xpath->evaluate('/events/event' as $event) {
      echo $xpath->evaluate('string(/event/titel)', $event), "\n";
      // ...
    }
    

    编码

    响应中的 XML 声明缺少编码。它是&lt;?xml version="1.0"?&gt;,但应该类似于&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;

    DOMDocument 默认使用 UTF-8。您可以转换字符串或确保 XML 定义了编码。

    $xml = iconv('ISO-8859-1', 'UTF-8//IGNORE', $xml);
    

    由于使用了字符集,utf8_encode() 也应该可以工作:

    $xml = utf8_encode($xml);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-26
      • 2017-04-27
      • 1970-01-01
      相关资源
      最近更新 更多