Thread overview | |||||||
---|---|---|---|---|---|---|---|
|
October 06, 2003 Which XML parser? | ||||
---|---|---|---|---|
| ||||
Which D XML parser are you using? I downloaded Andy's xmld but he said that we have an expat port available and should be better. Couldn't find it. Thanks Ant |
October 08, 2003 Re: Which XML parser? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Ant Attachments: | Ant wrote:
> Which D XML parser are you using?
>
> I downloaded Andy's xmld but he said that
> we have an expat port available and should
> be better.
> Couldn't find it.
>
> Thanks
> Ant
>
>
Ant,
I have attempted to wrap 1.95.3 of the expat parser, with very little luck. I'm afraid I'm only a beginner C programmer, and don't totally understand how a lot of things work, especially with callback functions and function pointers, etc. I've attached my expat.d wrapper module, so maybe you can take a look and see what I'm doing wrong. Also, I had to run implib on the precompiled dll's that came with the Win version of expat-1.95.3.
I think I might be pretty close. You may want to try extern(Windows) instead of extern(C) in the beginning of expat.d, although I'm not sure of the difference and Walter or the docs had said at one time to use extern (C) on the whole wrapper module. With extern (Windows), it compiles, but then can't find the dll.
I'll attach my whole project for you. Unzip by using path/folder info. The \ref directory has the originals.
Let me know how you do, and if you succeed, what you did.
Hope this helps...
|
October 09, 2003 Re: Which XML parser? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Brad Anderson | In article <bm21ua$ng0$1@digitaldaemon.com>, Brad Anderson says... > >This is a multi-part message in MIME format. >--------------040803070706080207070403 >Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit > >Ant wrote: >> Which D XML parser are you using? >> >> I downloaded Andy's xmld but he said that >> we have an expat port available and should >> be better. > >I have attempted to wrap 1.95.3 of the expat parser, with very little luck. I'm afraid I'm only a beginner C programmer, and don't totally understand how a lot of things work, especially with callback functions and function pointers, etc. I've attached my expat.d wrapper module, so maybe you can take a look I'm bookmarking this. If nobody else does I might take a look in a couple of days. (the best I can do is to give you back a linux version) Keep us informed if you have any progress. Thanks Ant |
October 09, 2003 Re: Which XML parser? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Ant |
> I'm bookmarking this.
> If nobody else does I might take a look in a couple of days.
> (the best I can do is to give you back a linux version)
> Keep us informed if you have any progress.
>
Linux version is fine. Also, if we make progress, I'll wrap 1.95.6, the latest release, January 2003, and attempt it for Win32 as well.
I've also been looking at the Java version of Xerces, which has a SAX and a DOM parser as well as XML 1.1 support. I'd be much better at converting Java to D, and I may toy with that in the future.
Brad
|
October 14, 2003 Re: Which XML parser? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Ant | I did an experimental wrapping of the libxml2 XmlReader API one night, to get a feel for how hard it would be: /* -*- mode: c++-mode; c-basic-offset: 4 -*- * * Example of using the libxml2 xmlReader API from D * (c) 2003 Mike Hearn <mike@theoretic.com> * Licensed under the GPL */ import string; typedef void* xmlTextReaderPtr; enum ReaderNodeType { Element = 1, Attribute = 2, Text = 3, CDATA = 4, EntityRef = 5, Entity = 6, ProcessingInstruction = 7, Comment = 8, Document = 9, DocumentType = 10, DocumentFrag = 11, Notation = 12, ElementEnd = 15 } extern (C) { xmlTextReaderPtr xmlNewTextReaderFilename(char *URI); void xmlFreeTextReader(xmlTextReaderPtr reader); /* iterators */ int xmlTextReaderRead(xmlTextReaderPtr reader); /* attributes */ int xmlTextReaderAttributeCount(xmlTextReaderPtr reader); char *xmlTextReaderLocalName (xmlTextReaderPtr reader); char *xmlTextReaderName (xmlTextReaderPtr reader); int xmlTextReaderNodeType (xmlTextReaderPtr reader); char *xmlTextReaderPrefix (xmlTextReaderPtr reader); char *xmlTextReaderValue (xmlTextReaderPtr reader); char *xmlTextReaderXmlLang (xmlTextReaderPtr reader); int xmlTextReaderReadState (xmlTextReaderPtr reader); char *xmlTextReaderGetAttribute(xmlTextReaderPtr reader, char *name); } class Reader { private: xmlTextReaderPtr _reader; public: this(char[] filename) { _reader = xmlNewTextReaderFilename(string.toStringz(filename)); } ~this() { assert(_reader); xmlFreeTextReader(_reader); } int read() { return xmlTextReaderRead(_reader); } void process() { int ret; ret = read(); while (ret == 1) { callback(this); ret = read(); } } void delegate(Reader reader) callback; char[] name() { return string.toString(xmlTextReaderName(_reader)); } ReaderNodeType type() { return (ReaderNodeType) xmlTextReaderNodeType(_reader); } char[] value() { return string.toString(xmlTextReaderValue(_reader)); } } int main(char[][] args) { printf("\nXML Demo\n\n"); void cb(Reader reader) { /* This function will be called as each node is read */ switch ( (int)reader.type ) { /* slight language wart here, enums should be acceptable in a switch expression imho */ case ReaderNodeType.Element: printf("start: <%.*s>\n", reader.name); break; case ReaderNodeType.Text: printf("text : %.*s\n", reader.value); break; case ReaderNodeType.ElementEnd: printf("end : </%.*s>\n", reader.name); break; default: printf("\n"); break; } } Reader reader2 = new Reader("test.xml"); reader2.callback = &cb; reader2.process(); return 0; } .... you get the idea. Obviously it's not a full DOM but the XmlReader API is quite easy to use anyway. thanks -mike |
Copyright © 1999-2021 by the D Language Foundation