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'));
}
0

1 Answer 1

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:

Sign up to request clarification or add additional context in comments.

3 Comments

the idea is to search for a performance name and then return the event details
thanks that worked, the only thing is, if there is two events with the same performance name, it only returns the first
@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 ;)

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.