2016-06-29 4 views
1

Ich habe die unten RSS zu analysieren, so etwas wie:PHP DOMDocument: Wie benutzerdefinierte XML/RSS-Tag-Namen mit COLONS analysieren?

<?xml version="1.0" encoding="utf-8"?> 
<rss xmlns:x-wr="http://www.w3.org/2002/12/cal/prod/Apple_Comp_628d9d8459c556fa#" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:x-example="http://www.example.com/rss/x-example" xmlns:x-microsoft="http://schemas.microsoft.com/x-microsoft" xmlns:xCal="urn:ietf:params:xml:ns:xcal" version="2.0"> 
    <channel> 
     <item> 
      <title>About Apples</title> 
      <author>David K. Lowie</title> 
      <description>Some description about apples</description> 
      <xCal:description>This is the full description about apples</xCal:description> 
     </item> 
     <item> 
      <title>About Oranges</title> 
      <author>Marry L. Jones</title> 
      <description>Some description about oranges</description> 
      <xCal:description>This is the full description about oranges</xCal:description> 
     </item> 
    </channel> 
</rss> 

In PHP, ich analysiere es so etwas wie:

$rss = new DOMDocument(); 
$rss->load("http://www.example.com/books.rss"); 

foreach($rss->getElementsByTagName("item") as $node) { 
    echo $node->getElementsByTagName("title")->item(0)->nodeValue, 
    echo $node->getElementsByTagName("author")->item(0)->nodeValue, 
    echo $node->getElementsByTagName("description")->item(0)->nodeValue, 
    echo $node->getElementsByTagName("xCal:description")->item(0)->nodeValue, 
} 

ich dort alles außer die xCal:description Knoten lesen kann. (Die Knotennamen sind genau so. description und xCal:description)

  1. Wie analysieren (lesen) die Knoten wiexCal:description
  2. Ist es wegen der ähnlichen Knotennamen, wie: description und die xCal:description?

(Ich kann nicht die Quelle RSS ändern, da es nicht unter meiner Kontrolle.)

Bitte freundlich helfen.

Antwort

1

Verwendung getElementsByTagNameNS():

$node->getElementsByTagNameNS("urn:ietf:params:xml:ns:xcal", "description")->item(0)->nodeValue 
+0

OMG dies funktioniert wie ein Charme !!! Ich danke dir sehr!!! Möge Gott dich segnen!!! –

+1

@ 夏 期 劇場 'echo $ knoten-> getElementsByTagNameNS ($ node-> lookupNamespaceURI ('xCal')," description ") -> item (0) -> nodeValue;' – splash58

+0

Hallo 'code-kobold' und' splash58', Danke für die Hilfe. Kannst du mir bitte auch hier helfen? Http://stackoverflow.com/questions/38096183/php-domdocument-how-to-parse-xml-rss-with-custom-tag-names (Danke an alle) –

1

Während des Namespace bewusst Varianten der DOM-Methoden verwenden, ist eine richtige Antwort, Sie vielleicht einen Blick auf Xpath nehmen wollen. Es ist eine viel bequemere Möglichkeit, Daten von einem DOM abzurufen.

Für den Xpath-Ausdruck können Sie je nach Bedarf eigene Präfixe für die Namespaces registrieren.

$rss = new DOMDocument(); 
$rss->load("http://www.example.com/books.rss"); 
$xpath = new DOMXpath($rss); 
$xpath->registerNamespace('xc', 'urn:ietf:params:xml:ns:xcal'); 

foreach($xpath->evaluate("//item") as $item) { 
    echo $xpath->evaluate('string(title)', $item), "\n"; 
    echo $xpath->evaluate('string(author)', $item), "\n"; 
    echo $xpath->evaluate('string(description)', $item), "\n"; 
    echo $xpath->evaluate('string(xc:description)', $item), "\n"; 
} 

Ausgang:

About Apples 
David K. Lowie 
Some description about apples 
This is the full description about apples 
About Oranges 
Marry L. Jones 
Some description about oranges 
This is the full description about oranges 
+0

Vielen Dank. Das ist ziemlich ordentlich. Kannst du mir bitte auch bei der anderen Frage helfen: http://stackoverflow.com/questions/38096183/php-domdocument-how-to-parse-xml-rss-with-custom-tag-names, bitte? :) –