Work with XML files


#1

Quick question, when working with XML files, is there a way to just read a portion of the file to get something, or the lib will load the whole thing up?

 

EG: lets say I have a file that holds preset-information and sample-data for a piano sound. But I just want to quickly open it up, get the Author name, so I can do a quick search for Author == X...

 

Any ideas on this?

Thanks!


#2

    /** Creates an XmlElement object to represent the main document node.
        This method will do the actual parsing of the text, and if there's a
        parse error, it may returns nullptr (and you can find out the error using
        the getLastParseError() method).
        See also the parse() methods, which provide a shorthand way to quickly
        parse a file or string.
        @param onlyReadOuterDocumentElement     if true, the parser will only read the
                                                first section of the file, and will only
                                                return the outer document element - this
                                                allows quick checking of large files to
                                                see if they contain the correct type of
                                                tag, without having to parse the entire file
        @returns    a new XmlElement which the caller will need to delete, or null if
                    there was an error.
        @see getLastParseError
    */
    XmlElement* getDocumentElement (bool onlyReadOuterDocumentElement = false);

#3

Oops, thanks, somehow I missed that, but I guess that looking at how much work I have done in the past weeks you can see how tired I am. <shame face>

Thanks again!


#4

Right now I´m using the PropertySet to create my XML file using the createXml call. So I guess what I need to do is just create another child first and have the attributes there and later add the xml element from createXml. I will figure this out, but any advice would be great, thanks again.

Best Regards, WilliamK


#5

Ok, just to confirm, before I do something stupid. <shame face>

The below is the preset Init.w4kpreset file.

Now, using the onlyReadOuterDocumentElement option would get me just <details Category=".........> before <Extra .... ?

Thanks again!

 

<?xml version="1.0" encoding="UTF-8"?>

<Details Category="User" Collection="Factory" Author="Wusik Dot Com" Description="Initial Blank Factory Preset"
         Tags="blank;factory;initial">
  <Extra Synth Name="Wusik 4000" Version Number="PreAlpha 00001 Win 64 bits"
         Preset Version="0000001" Date & Time="2013/09/30 10:03:53" Preset Filename="Init.w4kpreset"
         Preset Name="Init"/>
  <Data>
    <VALUE name="N.Layers" val="2"/>
    <VALUE name="0L N.Mods" val="0"/>
    <VALUE name="0L M.V." val="0"/>
    <VALUE name="0L A.Env" val="-1"/>
    <VALUE name="0L P.Env" val="-1"/>
    <VALUE name="0L F.Env" val="-1"/>
    <VALUE name="1L N.Mods" val="0"/>
    <VALUE name="1L M.V." val="0"/>
    <VALUE name="1L A.Env" val="-1"/>
    <VALUE name="1L P.Env" val="-1"/>
    <VALUE name="1L F.Env" val="-1"/>
    <VALUE name="0L M.Par.: Master vol" val="0.5"/>
    <VALUE name="0L M.Par.MA: Master vol" val="1"/>
    <VALUE name="0L M.Par.MM: Master vol" val="0"/>
    <VALUE name="0L M.Par.MX: Master vol" val="1"/>
    <VALUE name="0L M.Par.: Pan" val="0"/>
    <VALUE name="0L M.Par.MA: Pan" val="1"/>
    <VALUE name="0L M.Par.MM: Pan" val="0"/>
    <VALUE name="0L M.Par.MX: Pan" val="1"/>
    <VALUE name="0L M.Par.: Octave" val="0"/>
    <VALUE name="0L M.Par.MA: Octave" val="1"/>
    <VALUE name="0L M.Par.MM: Octave" val="0"/>
    <VALUE name="0L M.Par.MX: Octave" val="1"/>
    <VALUE name="0L M.Par.: Fine Tune" val="0"/>
    <VALUE name="0L M.Par.MA: Fine Tune" val="1"/>
    <VALUE name="0L M.Par.MM: Fine Tune" val="0"/>
    <VALUE name="0L M.Par.MX: Fine Tune" val="1"/>
    <VALUE name="0L M.Par.: 'A' Tune" val="440"/>
    <VALUE name="0L M.Par.MA: 'A' Tune" val="1"/>
    <VALUE name="0L M.Par.MM: 'A' Tune" val="0"/>
    <VALUE name="0L M.Par.MX: 'A' Tune" val="1"/>
    <VALUE name="0L M.Par.: MIDI Ch" val="0"/>
    <VALUE name="0L M.Par.MA: MIDI Ch" val="1"/>
    <VALUE name="0L M.Par.MM: MIDI Ch" val="0"/>
    <VALUE name="0L M.Par.MX: MIDI Ch" val="1"/>
    <VALUE name="0L M.Par.: Dry Out" val="1"/>
    <VALUE name="0L M.Par.MA: Dry Out" val="1"/>
    <VALUE name="0L M.Par.MM: Dry Out" val="0"/>
    <VALUE name="0L M.Par.MX: Dry Out" val="1"/>
    <VALUE name="0L M.Par.: Limiter" val="1"/>
    <VALUE name="0L M.Par.MA: Limiter" val="1"/>
    <VALUE name="0L M.Par.MM: Limiter" val="0"/>
    <VALUE name="0L M.Par.MX: Limiter" val="1"/>
    <VALUE name="1L M.Par.: Layer Volume" val="0.5"/>
    <VALUE name="1L M.Par.MA: Layer Volume" val="1"/>
    <VALUE name="1L M.Par.MM: Layer Volume" val="0"/>
    <VALUE name="1L M.Par.MX: Layer Volume" val="1"/>
    <VALUE name="1L M.Par.: Pan" val="0"/>
    <VALUE name="1L M.Par.MA: Pan" val="1"/>
    <VALUE name="1L M.Par.MM: Pan" val="0"/>
    <VALUE name="1L M.Par.MX: Pan" val="1"/>
    <VALUE name="1L M.Par.: Voices" val="5"/>
    <VALUE name="1L M.Par.MA: Voices" val="1"/>
    <VALUE name="1L M.Par.MM: Voices" val="0"/>
    <VALUE name="1L M.Par.MX: Voices" val="1"/>
    <VALUE name="1L M.Par.: Glide" val="0"/>
    <VALUE name="1L M.Par.MA: Glide" val="1"/>
    <VALUE name="1L M.Par.MM: Glide" val="0"/>
    <VALUE name="1L M.Par.MX: Glide" val="1"/>
    <VALUE name="1L M.Par.: Auto" val="1"/>
    <VALUE name="1L M.Par.MA: Auto" val="1"/>
    <VALUE name="1L M.Par.MM: Auto" val="0"/>
    <VALUE name="1L M.Par.MX: Auto" val="1"/>
    <VALUE name="1L M.Par.: Lgto" val="1"/>
    <VALUE name="1L M.Par.MA: Lgto" val="1"/>
    <VALUE name="1L M.Par.MM: Lgto" val="0"/>
    <VALUE name="1L M.Par.MX: Lgto" val="1"/>
    <VALUE name="1L M.Par.: Rtrg" val="0"/>
    <VALUE name="1L M.Par.MA: Rtrg" val="1"/>
    <VALUE name="1L M.Par.MM: Rtrg" val="0"/>
    <VALUE name="1L M.Par.MX: Rtrg" val="1"/>
    <VALUE name="1L M.Par.: Ssn" val="0"/>
    <VALUE name="1L M.Par.MA: Ssn" val="1"/>
    <VALUE name="1L M.Par.MM: Ssn" val="0"/>
    <VALUE name="1L M.Par.MX: Ssn" val="1"/>
    <VALUE name="1L M.Par.: Octave" val="0"/>
    <VALUE name="1L M.Par.MA: Octave" val="1"/>
    <VALUE name="1L M.Par.MM: Octave" val="0"/>
    <VALUE name="1L M.Par.MX: Octave" val="1"/>
    <VALUE name="1L M.Par.: Fine Tune" val="0"/>
    <VALUE name="1L M.Par.MA: Fine Tune" val="1"/>
    <VALUE name="1L M.Par.MM: Fine Tune" val="0"/>
    <VALUE name="1L M.Par.MX: Fine Tune" val="1"/>
    <VALUE name="1L M.Par.: Pitch Bend" val="12"/>
    <VALUE name="1L M.Par.MA: Pitch Bend" val="1"/>
    <VALUE name="1L M.Par.MM: Pitch Bend" val="0"/>
    <VALUE name="1L M.Par.MX: Pitch Bend" val="1"/>
    <VALUE name="1L M.Par.: Unison" val="0"/>
    <VALUE name="1L M.Par.MA: Unison" val="1"/>
    <VALUE name="1L M.Par.MM: Unison" val="0"/>
    <VALUE name="1L M.Par.MX: Unison" val="1"/>
    <VALUE name="1L M.Par.: MIDI Ch" val="0"/>
    <VALUE name="1L M.Par.MA: MIDI Ch" val="1"/>
    <VALUE name="1L M.Par.MM: MIDI Ch" val="0"/>
    <VALUE name="1L M.Par.MX: MIDI Ch" val="1"/>
    <VALUE name="1L M.Par.: Key Low" val="0"/>
    <VALUE name="1L M.Par.MA: Key Low" val="1"/>
    <VALUE name="1L M.Par.MM: Key Low" val="0"/>
    <VALUE name="1L M.Par.MX: Key Low" val="1"/>
    <VALUE name="1L M.Par.: Key High" val="127"/>
    <VALUE name="1L M.Par.MA: Key High" val="1"/>
    <VALUE name="1L M.Par.MM: Key High" val="0"/>
    <VALUE name="1L M.Par.MX: Key High" val="1"/>
    <VALUE name="1L M.Par.: Vel Low" val="0"/>
    <VALUE name="1L M.Par.MA: Vel Low" val="1"/>
    <VALUE name="1L M.Par.MM: Vel Low" val="0"/>
    <VALUE name="1L M.Par.MX: Vel Low" val="1"/>
    <VALUE name="1L M.Par.: Vel High" val="127"/>
    <VALUE name="1L M.Par.MA: Vel High" val="1"/>
    <VALUE name="1L M.Par.MM: Vel High" val="0"/>
    <VALUE name="1L M.Par.MX: Vel High" val="1"/>
    <VALUE name="1L M.Par.: Send SFX" val="0"/>
    <VALUE name="1L M.Par.MA: Send SFX" val="1"/>
    <VALUE name="1L M.Par.MM: Send SFX" val="0"/>
    <VALUE name="1L M.Par.MX: Send SFX" val="1"/>
    <VALUE name="0L Wires" val="0"/>
    <VALUE name="1L Wires" val="0"/>
    <VALUE name="Total Modules" val="0"/>
    <VALUE name="Total Wires" val="0"/>
    <VALUE name="Magic Number" val="e85e633b3205d14e6e784b6560bd06d6"/>
    <VALUE name="File Completed" val="yes"/>
  </Data>
</Details>

 


#6

Yes, that's right.


#7

Sadly I´m getting Unmatched Tags parse error with this file. I will try to understand what I´m doing wrong, as this is the first time I´m messing around with XML. <shame face>


#8

Ok, all working now, thanks again guys!!! <hug>


#9

I´m impressed on how fast was to filter 14000 files on my computer. Its just insane!

Jules, great work on the FileFilter, very easy to setup for what I´m doing. ;-)


#10

Yes, the XML parser has been very heavily optimised over the years, it can chew through data pretty quickly.