Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Get XML element text, skipping certain elements, into single string

Tags:

php

xml

xpath

Given this source file (file.xml):

<article>
<story name="column">
    <runs>
        <run p="902" c="103">
            THINK ABOUT IT
        </run>
    </runs>
</story>
<story name="body">
    <runs>
        <run p="895" c="103">
            ‘
        </run>
        <run p="895" c="920">
            T
        </run>
        <run p="895" c="103">
            here is an abiding
            <eol />
            beauty which may be
            <eol />
            appreciated by those
            <eol />
            who will see things as
            <eol />
            they are and who will
            <eol />
            ask for no reward
            <eol />
            except to see.’
            <eol />
        </run>
        <run p="896" c="103">
            Vera Brittain
            <eol />
            (1893-1970)
            <eol />
        </run>
        <run p="897" c="103">
            British author
        </run>
    </runs>
</story>

I've pulled it into a simple PHP script to get all the text from the story element with the attribute 'body':

<?php

$xml = simplexml_load_file( "file.xml" );

$body = $xml->xpath( "//story[@name='body']/*[not(self::eol)]" );
if( $body ){
    print_r( $body[0] );
}

?>

My output is pretty much what I expected:

SimpleXMLElement Object
(
    [run] => Array
        (
            [0] => ‘
            [1] => T
            [2] => here is an abiding beauty which may be appreciated by those who will see things as they are and who will ask for no reward except to see.’
    
            [3] => Vera Brittain 
    (1893-1970)
    
            [4] => British author
        )
)

For whatever reason, I can't find a way to access those values to concatenate them together. I've tried parsing through $body[0], $body[0]->run, etc, but nothing gives me the results I expect.

Bottom line, I need to get a string with the value:

‘There is an abiding 
beauty which may be 
appreciated by those 
who will see things as 
they are and who will 
ask for no reward 
except to see.’
     
Vera Brittain 
(1893-1970) 
British author

Thanks in advance!

like image 442
CMarcera Avatar asked Jun 11 '26 17:06

CMarcera


1 Answers

If you are able to run XSLT 1.0 stylesheet from your code, here is some XSLT code that gives you the result :

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">
    <xsl:output method="text"/>
    <xsl:strip-space elements="*"/>
    <xsl:template match="/">
        <xsl:apply-templates select="//story[@name='body']"/>
    </xsl:template>
    <xsl:template match="text()">
        <xsl:value-of select="normalize-space(.)"/>
    </xsl:template>
    <xsl:template match="eol">
        <xsl:text>&#13;</xsl:text>
    </xsl:template>
</xsl:stylesheet>

For this input :

<?xml version="1.0" encoding="UTF-8"?>
<article>
    <story name="column">
        <runs>
            <run p="902" c="103">
                THINK ABOUT IT
            </run>
        </runs>
    </story>
    <story name="body">
        <runs>
            <run p="895" c="103">
                ‘
            </run>
            <run p="895" c="920">
                T
            </run>
            <run p="895" c="103">
                here is an abiding
                <eol />
                beauty which may be
                <eol />
                appreciated by those
                <eol />
                who will see things as
                <eol />
                they are and who will
                <eol />
                ask for no reward
                <eol />
                except to see.’
                <eol />
            </run>
            <run p="896" c="103">
                Vera Brittain
                <eol />
                (1893-1970)
                <eol />
            </run>
            <run p="897" c="103">
                British author
            </run>
        </runs>
    </story>
</article>

The result is :

‘There is an abiding
beauty which may be
appreciated by those
who will see things as
they are and who will
ask for no reward
except to see.’
Vera Brittain
(1893-1970)
British author
like image 161
Vincent Biragnet Avatar answered Jun 14 '26 07:06

Vincent Biragnet



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!