[Gambas-user] New XML component

Caveat Gambas at ...1950...
Wed Apr 25 21:23:24 CEST 2012


Thanks Adrien!

Your change has inspired me to go through and re-check the logic of my
XMLParserToModel class and I have made a few changes to tighten up on
checking the reader.Node for NULL and to implement the change you
suggested (check state of the reader for EndElement instead of checking
for a Node with type EndElement (which the old gb.xml used to return)).

Both the generic XML Editor and the generic XML To TreeView Forms are
working fine now.

I have also successfully run the test suite which tests making changes
to XML based on tags and values etc. (the module named Test in the
project I sent earlier)... see results below:

*************** Provide some sample XML as a String ***************
inputString = <?xml version="1.0"
encoding="ISO-8859-1"?><?xml-stylesheet type = "text/css" href =
"cd_catalog.css"?><all_orders><order
priority="rush"><id>20101120123</id><desc>rubber
duck</desc></order><order priority="normal"><id>20101120124</id><desc>s
ponge</desc></order></all_orders>
*************** Now parse the XML *********************************
parserToModel.parseInputString(inputString)
*************** Get the model out of the parserToModel object and ask it
to represent itself as XML ***************
parserToModel.getModel().toXMLString("")
<all_orders>
  <order priority="rush">
    <id>20101120123</id>
    <desc>rubber duck</desc>
  </order>
  <order priority="normal">
    <id>20101120124</id>
    <desc>sponge</desc>
  </order>
</all_orders>

*******************************************************************************************************************

*************** Read the original Heroes input XML (See
http://pastebin.com/aR11N5uc) ***************
parserToModel.parseInputFile(User.home &/ "Heroes.xml")
*************** Look at the original XML we have in our internal data
model ***************
parserToModel.getModel().toXMLString("")
<all_characters>
  <characters series="Heroes">
    <heroe id="1", name="Claire Bennet">
      <name>Claire Bennet</name>
      <played_by>Hayden Panettiere</played_by>
      <ability>Rapid cellular regeneration</ability>
    </heroe>
    <heroe id="2", name="Hiro Nakamura">
      <name>Hiro Nakamura</name>
      <played_by>Masi Oka</played_by>
      <ability>Space-time manipulation: teleportation & time
travel</ability>
    </heroe>
    <villain id="1", name=" Gabriel Sylar">
      <name>Gabriel Sylar</name>
      <played_by>Zachary Quinto</played_by>
      <ability>Understand how things work and multiple other abilities
acquired</ability>
    </villain>
  </characters>
  <characters series="Banana Splits">
    <heroe id="1", name="Graham">
      <name>Graham</name>
      <played_by>Graham Bell</played_by>
      <ability>Being silly</ability>
    </heroe>
    <heroe id="2", name="Bill">
      <name>Bill</name>
      <played_by>Bill Odie</played_by>
      <ability>Being very silly</ability>
    </heroe>
    <heroe id="3", name="Tim">
      <name>Tim</name>
      <played_by>Tim Brook Taylor</played_by>
      <ability>Being very very silly</ability>
    </heroe>
  </characters>
</all_characters>

*******************************************************************************************
*************** All existing Text Entities
in /all_characters/characters/heroe/name with current value "Claire
Bennet" will be updated to "Banana Pudding" ***************
rewriter.updateTextByPath("/all_characters/characters/heroe/name",
"Claire Bennet", "Banana Pudding")
*************** All existing Text Entities
in /all_characters/characters/villain/played_by will be updated to
"Someone evil" regardless of the current content
rewriter.updateTextByPath("/all_characters/characters/villain/played_by", NULL, "Someone evil")
*************** All Text Entities with the value "Being silly" get
updated to "Being a complete donut brain"
rewriter.updateTextByValue("Being silly", "Being a complete donut
brain")
*************** Change the value of the attribute named "id" to "h1" on
all Entities having an Attribute named "name" with a value of "Claire
Bennet"
rewriter.changeAttribute("/all_characters/characters/heroe", "name",
"Claire Bennet", "id", "h1")
*************** Change the value of the attribute named "id" to "h2" on
all Entities having an Attribute named "name" with a value of "Hiro
Nakamura"
rewriter.changeAttribute("/all_characters/characters/heroe", "name",
"Hiro Nakamura", "id", "h2")
*************** First correct a fault in the XML (Attribute called
"name" has an erroneous space at the front of the value)
*************** So this will change the value of the Attribute named
"name" to "Gabriel Sylar" on all Entities having an Attribute named
"name" with a value of " Gabriel Sylar" (note the leading space)
rewriter.changeAttribute("/all_characters/characters/villain", "name", "
Gabriel Sylar", "name", "Gabriel Sylar")
*************** Now continue updating the ids
*************** Write out the new XML from the changed internal data
model (See http://pastebin.com/T0S96xiS)
rewriter.writeXML(User.home &/ "dev" &/ "NewHeroes.xml", TRUE, "UTF-8")
*************** Look at the new XML from the changed internal data model
***************
parserToModel.getModel().toXMLString("")
<all_characters>
  <characters series="Heroes">
    <heroe id="h1", name="Claire Bennet">
      <name>Banana Pudding</name>
      <played_by>Hayden Panettiere</played_by>
      <ability>Rapid cellular regeneration</ability>
    </heroe>
    <heroe id="h2", name="Hiro Nakamura">
      <name>Hiro Nakamura</name>
      <played_by>Masi Oka</played_by>
      <ability>Space-time manipulation: teleportation & time
travel</ability>
    </heroe>
    <villain id="v1", name="Gabriel Sylar">
      <name>Gabriel Sylar</name>
      <played_by>Someone evil</played_by>
      <ability>Understand how things work and multiple other abilities
acquired</ability>
    </villain>
  </characters>
  <characters series="Banana Splits">
    <heroe id="b1", name="Graham">
      <name>Graham</name>
      <played_by>Graham Bell</played_by>
      <ability>Being a complete donut brain</ability>
    </heroe>
    <heroe id="b2", name="Bill">
      <name>Bill</name>
      <played_by>Bill Odie</played_by>
      <ability>Being very silly</ability>
    </heroe>
    <heroe id="b3", name="Tim">
      <name>Tim</name>
      <played_by>Tim Brook Taylor</played_by>
      <ability>Being very very silly</ability>
    </heroe>
  </characters>
</all_characters>

****************************************************************************************
*************** Read the original wireless-network input XML (See
http://pastebin.com/4DGwdzYD) ***************
parserToModel.parseInputFile(User.home &/
"/dev/xml/wireless-network.xml")
*************** Look at the original XML we have in our internal data
model ***************
parserToModel.getModel().toXMLString("")
<wireless-network first-time="Mon Mar 28 14:47:18 2011", last-time="Mon
Mar 28 14:52:10 2011", number="1", type="infrastructure">
  <SSID first-time="Mon Mar 28 14:47:18 2011", last-time="Mon Mar 28
14:52:10 2011">
    <type>Probe Response</type>
    <max-rate>54.000000</max-rate>
    <packets>29</packets>
    <encryption>None</encryption>
    <essid cloaked="false">AMX</essid>
  </SSID>
  <BSSID>00:02:E3:45:C1:F8</BSSID>
  <manuf>Lite-OnCom</manuf>
  <channel>9</channel>
  <freqmhz>2442 1</freqmhz>
  <freqmhz>2447 5</freqmhz>
</wireless-network>

*******************************************************************************************
Get the Attribute " type " from the path wireless-network
infrastructure
****************************************************************************************

Thanks for taking the time to look into the problems.

Kind regards,
Caveat


On Wed, 2012-04-25 at 02:06 +0200, Adrien Prokopowicz wrote:
> Le lundi 23 avril 2012 12:05:13 Caveat a écrit :
> > Benoit and Fabien, you're both right of course.
> > 
> > Sorry, I was a little frustrated by how broken gb.xml now appears to be.
> > 
> > The project I've sent does allow you guys to get some serious testing in
> > and I'm here should you have any questions about the project and the
> > code.
> > 
> > There are plenty of simple xml examples out on the web, the beauty of my
> > project is that it *should* be generic enough to read pretty much any of
> > those xml examples either from file or from string and doesn't have to
> > be told about specific tags...
> > 
> > Regards,
> > Caveat
> > 
> 
> With the revision #4669, your projects (the 3 forms i tested) work perfectly 
> on my side, with the Heroes.xml file. 
> I just had to make a little modification, i think that was why the reader 
> appeared broken (in XmlParserToModel:171, and :200) : 
> 
> If reader.Node.Type = XmlReaderNodeType.EndElement
> 
> This didn't work because reader.Node.Type never returns EndElement. It is 
> logical : EndElement is a State (the reader state) and reader.Node.Type is a 
> node type. So you should use the reader.State property instead : 
> 
> If reader.State = XmlReaderNodeType.EndElement
> 
> (Yes, the XmlReaderNodeType class should be renamed, but I can't, for 
> compatibility reasons ... )
> 
> Regards,
> Adrien.






More information about the User mailing list