2016-06-29 28 views
0

Ich habe die unten RSS zu analysieren, so etwas wie:PHP DOMDocument: Wie XML/RSS-Tags mit benutzerdefinierten Feldnamen zu 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> 
      <x-trumba:customfield name="description">This is the description about apples</xCal:customfield> 
      <x-trumba:customfield name="category">Fruits,Food,Apple</xCal:customfield> 
     </item> 
     <item> 
      <title>About Oranges</title> 
      <author>Marry L. Jones</title> 
      <x-trumba:customfield name="description">This is the description about oranges</xCal:customfield> 
      <x-trumba:customfield name="category">Fruits,Food,Orange</xCal:customfield> 
     </item> 
    </channel> 
</rss> 

In PHP, ich weiß nur, wie zunächst zwei Knoten zu lesen, 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, 
} 

Aber sind diese diejenigen, die Probleme:

<x-trumba:customfield name="description">This is the description about apples</xCal:customfield> 
<x-trumba:customfield name="category">Fruits,Food,Apple</xCal:customfield> 

Bitte helfen:

  • Wie werden die letzten Knoten wie<x-trumba:customfield name="description"> analysiert?

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

Bitte freundlich helfen.

+0

Mit was für einem Problem sind Sie nach dieser Antwort konfrontiert? – splash58

+0

@ splash58 Ich kann die Knoten mit den benutzerdefinierten Feldern nicht lesen (parsen), wie ''. Bitte freundlich helfen. –

Antwort

0

Ihr XML ist ungültig, das Präfix 'x-trumba' ist nicht definiert, und die schließenden Tags der Elemente verwenden das Präfix 'xCal', bezogen auf urn:ietf:params:xml:ns:xcal.

Wenn Sie also das Präfix der öffnenden Tags durch 'xCal' ersetzen und die schließenden Tags für 'author' korrigieren, wird XML gültig.

Dann ist es möglich, den xCalendar Namensraum registrieren und verwenden Xpath die benutzerdefinierten Feldinhalte abzurufen:

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

foreach($xpath->evaluate("//item") as $item) { 
    echo $xpath->evaluate('string(title)', $item), "\n"; 
    echo $xpath->evaluate('string(x:customfield[@name="description"])', $item), "\n"; 
} 

Output:

About Apples 
This is the description about apples 
About Oranges 
This is the description about oranges 

XPath-Ausdruck eine Bedingung verwenden ([@name="description"]) zu filtern, die customfield Elementknoten.