|
|
| Perl-Sensitive Sunglasses | |
| PerlMonks |
(RFC) XML::Rules - yet another XML parserby Jenda (Monsignor) |
| on Oct 30, 2006 at 15:29 UTC ( #581313=perlmeditation: print w/ replies, xml ) | Need Help?? |
|
This is a continuation to my previous (RFC) XML::TransformRules node. The first version of the module, for now without support for namespaces and processing instructions (and comments - you might want to process even those in some cases) may be found at my site. A few weeks ago someone compared XML to Lisp. I can't find the node now, but it was something about how you could just transform the XML to Lisp and let it execute to produce the result you need. This forced me to think ... if we can transform the XML to Lisp, we can just as well transform it to Perl: but the question is whether we would gain anything. Of course it would be silly to convert the whole XML to Perl code and then eval("") it, we can instead execute the subroutines as we parse the closing tag and just remember the results so that we could pass them to the subroutine for the parent tag. I tried to come up with a few examples of things I might want to do with a XML and tried to implement them in this style and I like the results. Maybe it's my functional programming affected brain, but I find this style convenient. As you can see the rules applied to the parsed tags are basicaly of two types. Either they specify what data gets passed to the parent tag's rule and how or they do something with the attributes of the tag and the data returned by the rules of subtags. You can of course do both in your rules. For example if the XML looked like this: You might use a subroutine like this for the <address> tag: and proceed as if the data was directly in the XML in all cases. Let me know please what you think. I'd also be grateful for any suggestions regarding the support for XML namespaces. Update 2006-11-07: I just uploaded an updated version of the module, with more tests and "start tag" rules allowing you to skip branches of XML if you can decide based on the tag's attribute that you do not need them. I also uploaded the module to CPAN.
Back to
Meditations
|
|
||||||||||||||||||||||||||||||||||