MathGroup Archive 2007

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: XML data structure parsing in Mathematica 6 using patterns

  • To: mathgroup at smc.vnet.net
  • Subject: [mg81562] Re: XML data structure parsing in Mathematica 6 using patterns
  • From: Chris Chiasson <chris.chiasson at gmail.com>
  • Date: Wed, 26 Sep 2007 21:55:23 -0400 (EDT)
  • References: <fdddo2$9cb$1@smc.vnet.net>

On Sep 26, 5:53 am, Daniel Flatin <dfla... at rcn.com> wrote:
> This is my third attempt at posting this message. Apologies if somehow
> the first two got through. I saw no sign of them, however.
>
> I have an XML data structure where I want to extract the start and end
> times, for example:
>
> timeBlock = XMLElement["time-layout", {"time-coordinate" -> "local",
>   "summarization" -> "none"}, {XMLElement[
>    "layout-key", {}, {"k-p12h-n14-1"}],
>   XMLElement["start-valid-time", {}, {"2007-09-21T20:00:00-04:00"}],
>   XMLElement["end-valid-time", {}, {"2007-09-22T08:00:00-04:00"}],
>   XMLElement["start-valid-time", {}, {"2007-09-22T08:00:00-04:00"}],
>   XMLElement["end-valid-time", {}, {"2007-09-22T20:00:00-04:00"}],
>   XMLElement["start-valid-time", {}, {"2007-09-22T20:00:00-04:00"}],
>   XMLElement["end-valid-time", {}, {"2007-09-23T08:00:00-04:00"}],
>   XMLElement["start-valid-time", {}, {"2007-09-23T08:00:00-04:00"}],
>   XMLElement["end-valid-time", {}, {"2007-09-23T20:00:00-04:00"}],
>   XMLElement["start-valid-time", {}, {"2007-09-23T20:00:00-04:00"}],
>   XMLElement["end-valid-time", {}, {"2007-09-24T08:00:00-04:00"}],
>   XMLElement["start-valid-time", {}, {"2007-09-24T08:00:00-04:00"}],
>   XMLElement["end-valid-time", {}, {"2007-09-24T20:00:00-04:00"}]}]
>
> I can do this by finding all start times and all end times and then
> combining them, as in
>
> getTimeSequence[timeBlock_] :=
>  Module[{startBlock, endBlock, startT, endT},
>   startBlock = Cases[timeBlock,
>     XMLElement["start-valid-time", _, {startT_}] :> startT,
>     Infinity];
>   endBlock = Cases[timeBlock, XMLElement["end-valid-time", _, {endT_}]
> :> endT,
>     Infinity];
>   Transpose[{startBlock, endBlock}]
>   ]
>
> Philosophically, I think I should be able to capture the start and end
> times with a single pattern, but I can't make it work. For example I
> have tried:
>
> getTimeStartStopPairs[timeBlock_] :=
>  Module[{startBlock, endBlock, startT, endT},
>   Cases[
>    timeBlock,
>    PatternSequence[XMLElement["start-valid-time", _, {startT_}],
>      XMLElement["end-valid-time", _, {endT_}]] :> {startT, endT},
>    Infinity
>    ]
>   ]
>
> Does anyone have any suggestions? I would like to learn how to do this
> with just one pattern and I feel like I am misinterpreting how
> PatternSequence works.
>
> Thanks,
> Dan

timeBlock /.
 XMLElement[
   "time-layout", _, {layoutKeyElement_,
    dataElements :
     PatternSequence[XMLElement["start-valid-time", __],
       XMLElement["end-valid-time", __]] ..}] :>
  Partition[{dataElements}[[All, 3, 1]], 2]

--
http://chris.chiasson.name/



  • Prev by Date: Re: Re: Any Mathematica 6 book yet?
  • Next by Date: Dependence of precision on execution speed of Inverse
  • Previous by thread: Re: XML data structure parsing in Mathematica 6 using patterns
  • Next by thread: Re: XML data structure parsing in Mathematica 6 using patterns