Menu

XML to CSV with nested items

Help
tcranford
2013-11-13
2013-11-17
  • tcranford

    tcranford - 2013-11-13

    Greetings,
    I am evaluating ServingXML for a small project. I'm having difficulties doing transformations with a non-conforming XML feed.

    Here is an example of the XML feed:

    <?xml version="1.0" encoding="utf-8"?>
    <meals>
      <meal>
        <meat>Beef</meat>
        <vegetable>Carrot</vegetable>
        <bread>Sourdough</bread>
        <fruits>
            <fruit>Apple</fruit>
            <fruit>Orange</fruit>
            <fruit>Banana</fruit>
        </fruits>
      </meal>
      <meal>
        <meat>Chicken</meat>
        <vegetable>Corn</vegetable>
        <bread>Wheat</bread>
        <fruits>Pear</fruits>
      </meal>
    </meals>
    

    Here is what I get when I process using my resource script:

    meat,vegetable,bread,fruits
    Beef,Carrot,Sourdough,"
            Apple
            Orange
            Banana
        "
    Chicken,Corn,Wheat,Pear
    

    And here is what I'd like to see from the feed after processing:

    meat,vegetable,bread,fruits
    Beef,Carrot,Sourdough,Apple;Orange;Banana
    Chicken,Corn,Wheat,Pear
    

    Here is my resource script:

    <?xml version="1.0"?>
    
    <sx:resources xmlns:sx="http://www.servingxml.com/core">
    
      <sx:service id="meals2csv"> 
        <sx:recordStream>
          <sx:subtreeRecordReader>
            <sx:inverseRecordMapping ref="mealsToFileMapping"/>
            <sx:transform>
              <sx:document/>
            </sx:transform>
          </sx:subtreeRecordReader>
          <sx:flatFileWriter>
            <sx:flatFile ref="mealsFile"/>
          </sx:flatFileWriter>
        </sx:recordStream>
      </sx:service>
    
      <sx:flatFile id="mealsFile">
        <sx:flatFileHeader>
          <sx:flatRecordType ref="mealType"/>
        </sx:flatFileHeader>
        <sx:flatFileBody>
          <sx:flatRecordType ref="mealType"/>
        </sx:flatFileBody>
      </sx:flatFile>
    
      <sx:flatRecordType id="mealType" name="mealType">
        <sx:fieldDelimiter value=","/>
        <sx:delimitedField name="meat" label="meat"/>
        <sx:delimitedField name="vegetable" label="vegetable"/>
        <sx:delimitedField name="bread" label="bread"/>
        <sx:delimitedField name="fruits" label="fruits">
            <sx:delimitedField name="fruit" label="fruit">
                <sx:subfieldDelimiter value=";"/>
            </sx:delimitedField>
        </sx:delimitedField>
      </sx:flatRecordType>
    
      <sx:inverseRecordMapping id="mealsToFileMapping">
        <sx:onSubtree path="/meals/meal">
          <sx:flattenSubtree recordType="meal">
            <sx:subtreeFieldMap select="meat" field="meat"/>
            <sx:subtreeFieldMap select="vegetable" field="vegetable"/>
            <sx:subtreeFieldMap select="bread" field="bread"/>
            <sx:subtreeFieldMap select="fruits" field="fruits"/>
            </sx:flattenSubtree>
        </sx:onSubtree>
      </sx:inverseRecordMapping>
    
    </sx:resources>
    

    Another issue that I need to deal with is that within the XML feed I see periodic, odd embedded (unencoded) "&" that plays havoc with my script. For example: <fruit>Strawberries & Bananas</fruit>
    Do I need to search and replace these odd occurrences?

    Any help would be greatly appreciated!

     

    Last edit: tcranford 2013-11-13
    • tcranford

      tcranford - 2013-11-17

      Anyone?

       

Log in to post a comment.

MongoDB Logo MongoDB