Le Fri, 11 Aug 2017 09:05:18 +0200, Hans Lehmann <h...@gambas-buch.de> a
écrit:
Hello Adrien,
Thanks for the explanation to ReadFlags in the above example. If you
want to read and display the content of the structure of an XML
document, the output is not helpful because it seems illogical.
https://gambas-playground.proko.eu/?gist=b90eeff3dacbec0548d01701f3c05133
--------------------------------------------------------------------------
Use "gb.xml"
Dim contents As String = "<xml>"
"<foo>"
" <p attr=\"1\" mausi=\"xy\">Hello</p>"
" <p attr=\"2\">Hi</p>"
" <p attr=\"3\">Greetings</p>"
"</foo>"
"</xml>"
Dim reader As New XmlReader
reader.FromString(contents)
'Toggle these :)
reader.ReadFlags[XmlReaderNodeType.Element] = True
reader.ReadFlags[XmlReaderNodeType.Attribute] = True
reader.ReadFlags[XmlReaderNodeType.Text] = True
reader.ReadFlags[XmlReaderNodeType.EndElement] = false
reader.Read()
Repeat
Print reader.Node.Type;;
Select Case reader.Node.Type
Case XmlReaderNodeType.Element
Print "element";;reader.Node.name
Case XmlReaderNodeType.Attribute
Print "attribute"
Case XmlReaderNodeType.Text
Print "text";;reader.node.value
Case XmlReaderNodeType.Comment
Print "comment"
Case XmlReaderNodeType.CDATA
Print "cdata"
Case XmlReaderNodeType.EndElement
Print "endelement"
Default
Print ""
End Select
reader.Read()
Until reader.Eof
Original-Output in a console:
1 element xml1 element foo8 attribute8 attribute1 element p2 text Hello8
attribute1 element p2 text Hi8 attribute1 element p2 text Greetings
This output I would have expected because it shows the structure of the
XML file. The upper output does not show which element the attributes
belong to. Extremely confusing!
1 element xml1 element foo1 element p8 attribute8 attribute2 text Hello1
element p8 attribute2 text Hi1 element p8 attribute2 text Greetings
What now - what to do?
RegardsHans,who still has many questions about the component gb.xml ...
This is the normal behavior : the Read() method returns when it *finishes*
reading something. Therefore, it finishes reading the attributes *before*
finishing reading the element.
While this behavior is intended, I completely agree that it is very
confusing.
However, XmlReader is not an easy class to use : its design is based on
the standard XML SAX API, which is meant to be used when your data comes
from a stream (hence the complexity : you don't know what to expect going
forward, and you have to remember yourself what has been previously read).
The XmlDocument class, on the other hand, is based on the XML DOM API. It
is much easier to navigate into an XML document, and all it requires is to
have the entirety of the document loaded in memory.
This requirement makes XmlReader more appropriate if you are in one of
these two situations :
- The Document comes from a very slow stream source (i.e. a *very* slow
network connection), and you want to start reading the document before it
finishes loading.
- The Document you're trying to load is very big, and you can't afford to
load it all in memory (today, it means more than 100MB in size, which is
already crazy for an XML Document).
These are the only two reasons I see for actually using the XmlReader
class. Otherwise, use the XmlDocument class, it is *way* simpler and more
powerful. :)
(I also wrote a page on the wiki explaining the differences here :
http://gambaswiki.org/wiki/doc/xml )
--
Adrien Prokopowicz
------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Gambas-user mailing list
Gambas-user@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/gambas-user