2

I have an XML Structure like the following:

<Tickets>
<EventsPoints>
      <Event ID="23">
           <PerformanceName>U2</PerformanceName>
           <EventDate>25/05/2012</EventDate>
           <EventPrice>75.00</EventPrice>
      </Event>
      <Event ID="27">
           <PerformanceName>Jedward</PerformanceName>
           <EventDate>28/05/2012</EventDate>
           <EventPrice>20.00</EventPrice>
      </Event>
            <Event ID="27">
           <PerformanceName>Rolling Stones</PerformanceName>
           <EventDate>03/12/2012</EventDate>
           <EventPrice>80.00</EventPrice>
      </Event>
</EventsPoints>
</Tickets>

Basically I want to search this XML for a certain performance name, say "U2", and then return that entire XML block (i.e. that performance name, event date and price - all in formatted XML and saved in a separate xml file)

This is my php code but it doesn't seem to be extracting the data correctly:

$srcDom = new DOMDocument;
$srcDom->load('/var/www/html/xml/searchfile.xml');
$xPath = new DOMXPath($srcDom);


foreach ($srcDom->getElementsByTagName('Event') as $event) {

    $dstDom = new DOMDocument('1.0', 'utf-8');
    $dstDom->appendChild($dstDom->createElement('EventsPricePoints'));
    $dstDom->documentElement->appendChild($dstDom->importNode($event, true));

    $allEventsForVenue = $xPath->query(
        sprintf(
            '/Tickets/EventsPoints/Event/PerformanceName[.="U2"]'
        )
    );

    foreach ($allEventsForVenue as $event) {
        $dstDom->documentElement->appendChild($dstDom->importNode($event, true));
    }

    $dstDom->formatOutput = true;
    $dstDom->save(sprintf('/var/www/html/xml/searchresults1.xml'));
}
user1417302
  • 411
  • 3
  • 9
  • 22

1 Answers1

1

Your XPath gets the PerformanceName element when you want the parent element. Change it to

/Tickets/EventsPoints/Event/PerformanceName[.="U2"]/..

or

/Tickets/EventsPoints/Event[PerformanceName[.="U2"]]

or import

$event->parentNode

Also, you dont need the first foreach. Remove it and move the code writing the $dstDom into the code iterating the XPath result. See http://codepad.org/zfOZXycZ

Also see:

Community
  • 1
  • 1
Gordon
  • 312,688
  • 75
  • 539
  • 559
  • the idea is to search for a performance name and then return the event details – user1417302 May 25 '12 at 12:03
  • thanks that worked, the only thing is, if there is two events with the same performance name, it only returns the first – user1417302 May 25 '12 at 12:16
  • @user I am pretty sure you'll figure out how to change this with the given information. There has to be something for you to find out, too ;) – Gordon May 25 '12 at 12:23