build a tree in XML

Discussion in 'XML' started by E, Dec 10, 2006.

  1. E

    E Guest

    Hi everyone,

    I'm new to XML and I'm just wondering if someone could point me to some
    tutorials on how to generate an XML file using PHP? I've been Googling for
    a few hours and I've yet to find anything that matches what I'm trying to
    do. Maybe I'm not using the correct terms??? :)

    What I'm trying to do is to use data from the MySQL table below to generate
    an XML file which I will then use to display that info as a hierarchy.

    +----+-----------+------------------+
    | id | parent_id | name |
    +----+-----------+------------------+
    | 1 | NULL | about us |
    | 2 | NULL | products |
    | 3 | NULL | contact us |
    | 4 | 2 | product1 |
    | 5 | 2 | product2 |
    | 6 | 2 | product3 |
    | 7 | 4 | category1.1 |
    | 8 | 4 | category1.2 |
    | 9 | 4 | category1.3 |
    | 10 | 5 | category2.1 |
    | 11 | 5 | category2.2 |
    | 12 | 6 | category3.1 |
    | 13 | 7 | subcategory1.1.1 |
    | 14 | 7 | subcategory1.1.2 |
    +----+-----------+------------------+


    Expected result:

    - About Us
    - Products
    - Product 1
    - Category 1.1
    - SubCategory 1.1.1
    - SubCategory 1.1.2
    - Category 1.2
    - Category 1.3
    - Product 2
    - Category 2.1
    - Category 2.2
    - Product 3
    - Category 3.1
    - Contact Us

    First of all, how do I arrange the above data into an XML file and then, how
    do I read the data from the file and display it like the list above?

    TIA
    Eric
    E, Dec 10, 2006
    #1
    1. Advertising

  2. I'm not sure what question you're asking.

    All XML documents are hierarchically structured, and thus can be
    considered as trees. Tree nodes can generally be mapped fairly directly
    to XML elements.

    Building and accessing XML from an arbitrary program is generally done
    with one of the standard APIs such as SAX or DOM, plus parsers and
    serializers which speak those APIs. These tools are widely available.

    Rendering XML content into a displayed form is generally done either by
    special-purpose code (in which case, see previous paragraph) or using an
    XSLT stylesheet.

    --
    () ASCII Ribbon Campaign | Joe Kesselman
    /\ Stamp out HTML e-mail! | System architexture and kinetic poetry
    Joe Kesselman, Dec 10, 2006
    #2
    1. Advertising

  3. E wrote:

    > What I'm trying to do is to use data from the MySQL table below to generate
    > an XML file which I will then use to display that info as a hierarchy.


    Assuming that your data can be stored into
    an ASCII file like this:

    1 NULL about us
    2 NULL products
    3 NULL contact us
    4 2 product1
    5 2 product2
    6 2 product3
    7 4 category1.1
    8 4 category1.2
    9 4 category1.3
    10 5 category2.1
    11 5 category2.2
    12 6 category3.1
    13 7 subcategory1.1.1
    14 7 subcategory1.1.2

    Then you can use the following AWK script
    to convert this to XML:

    BEGIN { print "<?xml version=\"1.0\" ?>\n<root>" }

    { id=$1; parent[id] = $2; $1=$2=""; elem[id] =$0 }

    END { out_xml("NULL", 0); print "</root>" }

    function out_xml(i, d) {
    for (id in parent) {
    if (parent[id] == i) {
    printf("%s%s\n", "<lev" d ">", elem[id])
    out_xml(id, d+1)
    printf "</lev" d ">"
    }
    }
    }

    > First of all, how do I arrange the above data into an XML file and then, how
    > do I read the data from the file and display it like the list above?


    The output of the script above for the given example
    looks like this:

    <?xml version="1.0" ?>
    <root>
    <lev0> about us
    </lev0><lev0> products
    <lev1> product1
    <lev2> category1.1
    <lev3> subcategory1.1.1
    </lev3><lev3> subcategory1.1.2
    </lev3></lev2><lev2> category1.2
    </lev2><lev2> category1.3
    </lev2></lev1><lev1> product2
    <lev2> category2.1
    </lev2><lev2> category2.2
    </lev2></lev1><lev1> product3
    <lev2> category3.1
    </lev2></lev1></lev0><lev0> contact us
    </lev0></root>
    =?ISO-8859-1?Q?J=FCrgen_Kahrs?=, Dec 10, 2006
    #3
  4. E

    Guest

    E wrote:
    > I'm new to XML and I'm just wondering if someone could
    > point me to some tutorials on how to generate an XML file
    > using PHP?
    >
    > What I'm trying to do is to use data from the MySQL table
    > below to generate an XML file which I will then use to
    > display that info as a hierarchy.


    [relational data]

    > First of all, how do I arrange the above data into an XML
    > file


    It's very straightforward:

    <?php

    error_reporting ( E_ALL ) ;

    $data =
    array
    (
    array
    (
    'id' => 1 ,
    'parent_id' => NULL ,
    'name' => 'about us' ,
    ) ,
    /* *************************
    * the rest of your data *
    ************************* */
    ) ;

    function genxml ( $data , $parent = NULL )
    {
    $result = '' ;
    foreach ( $data as $element )
    {
    if ( $element [ 'parent_id' ] == $parent )
    {
    $element [ 'name' ] =
    preg_replace
    (
    '/\s+/' ,
    '_' ,
    $element [ 'name' ]
    ) ;
    $element [ 'no' ] =
    preg_replace
    (
    '/^.*?(\d*)$/' ,
    ' no="\1"' ,
    $element [ 'name' ]
    ) ;
    $element [ 'name' ] =
    preg_replace
    (
    '/[\d\.]+$/' ,
    '' ,
    $element [ 'name' ]
    ) ;
    $result .=
    '<' . $element [ 'name' ] .
    (
    $element [ 'no' ] != ' no=""'
    ? $element [ 'no' ]
    : ''
    ) .
    '>' ;
    $result .= genxml ( $data , $element [ 'id' ] ) ;
    $result .= '</' . $element [ 'name' ] . '>' ;
    }
    }
    return $result ;
    }

    header ( 'Content-Type: text/xml' ) ;

    print
    (
    '<?xml-stylesheet type="text/xsl" href="genxml.xsl"?>'
    ) ;
    print ( '<data>' ) ;
    print ( genxml ( $data ) ) ;
    print ( '</data>' ) ;

    ?>

    > and then, how do I read the data from the file and
    > display it like the list above?


    The following transformation (referred above as
    'genxml.xsl') does that:

    <xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:eek:utput method="text"/>
    <xsl:template match="/data">
    <xsl:apply-templates/>
    </xsl:template>
    <xsl:template match="*">
    <xsl:param name="indent" select="''"/>
    <xsl:value-of select="$indent"/>
    <xsl:text>- </xsl:text>
    <xsl:apply-templates select="." mode="get-name"/>
    <xsl:if test="@no">
    <xsl:call-template name="get-no"/>
    </xsl:if>
    <xsl:text>
    </xsl:text>
    <xsl:apply-templates>
    <xsl:with-param
    name="indent"
    select="concat($indent,' ')"/>
    </xsl:apply-templates>
    </xsl:template>
    <xsl:template match="about_us" mode="get-name">
    <xsl:text>About Us</xsl:text>
    </xsl:template>
    <xsl:template match="products" mode="get-name">
    <xsl:text>Products</xsl:text>
    </xsl:template>
    <xsl:template match="contact_us" mode="get-name">
    <xsl:text>Contact Us</xsl:text>
    </xsl:template>
    <xsl:template match="product" mode="get-name">
    <xsl:text>Product</xsl:text>
    </xsl:template>
    <xsl:template match="category" mode="get-name">
    <xsl:text>Category</xsl:text>
    </xsl:template>
    <xsl:template match="subcategory" mode="get-name">
    <xsl:text>SubCategory</xsl:text>
    </xsl:template>
    <xsl:template name="get-no">
    <xsl:text> </xsl:text>
    <xsl:apply-templates select=".." mode="get-no"/>
    <xsl:value-of select="@no"/>
    </xsl:template>
    <xsl:template match="*[not(@no)]" mode="get-no"/>
    <xsl:template match="*[@no]" mode="get-no">
    <xsl:apply-templates select=".." mode="get-no"/>
    <xsl:value-of select="@no"/>
    <xsl:text>.</xsl:text>
    </xsl:template>
    </xsl:stylesheet>

    Figuring out how does all of that work is left as a
    (potentially enlightening) exercise for the reader.

    --
    Pavel Lepin
    , Dec 11, 2006
    #4
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Ramkumar Menon

    B+ Tree versus Ternary Search Tree

    Ramkumar Menon, Aug 16, 2005, in forum: Java
    Replies:
    2
    Views:
    1,598
    Roedy Green
    Aug 16, 2005
  2. Joris Gillis
    Replies:
    2
    Views:
    1,531
    Joris Gillis
    Jun 16, 2006
  3. Stub

    B tree, B+ tree and B* tree

    Stub, Nov 12, 2003, in forum: C Programming
    Replies:
    3
    Views:
    10,109
  4. sharan
    Replies:
    4
    Views:
    1,275
    Pavel Lepin
    Nov 5, 2007
  5. Peter Reimer
    Replies:
    4
    Views:
    1,109
    Peter Flynn
    Apr 12, 2010
Loading...

Share This Page