Toon posts:

[VB] XML opslaan via DOM

Pagina: 1
Acties:

Verwijderd

Topicstarter
Wie kan mij helpen.

Ben momenteel bezig met het maken van een progje dat rules moet kunnen wegschrijven naar een XML-file. Ik krijg alleen iets niet voor elkaar. Zie voorbeeld van een goede Rule in XML-file:

<RULE Priority="B" Name="Wakkerworden">
<TERM Operator="AND">
<OPERAND>
<DEVICEREF DeviceID="T1"></DEVICEREF>
</OPERAND>
<OPERAND>
<VALUE>2000</VALUE>
</OPERAND>
</TERM>
<TRUECLAUSE>
<ACTION>
<DEVICEREF DeviceID="A1"></DEVICEREF>
<VALUE>10</VALUE>
</ACTION>
</TRUECLAUSE>
<FALSECLAUSE>
<ACTION>
<DEVICEREF DeviceID="A1"></DEVICEREF>
<VALUE>100</VALUE>
</ACTION>
</FALSECLAUSE>
</RULE>

Nu heb ik het probleem dat ik bij het toevoegen van een childnode type <TERM> de volgende regel krijg in mijn XML.

<RULE Priority="None" Name="None"><TERM Operator=""/></RULE></RULELIST>
Hij Sluit dus niet netjes met </TERM>

Hier de code:
Public Sub AddRule(NewRule As clsRule, NewTerm As clsTerm)
On Error GoTo ErrorHandler
'<RULELIST>
Dim RuleList As IXMLDOMNode
'<RULE>
Dim Rule As IXMLDOMNode
'<TERM>
Dim Term As IXMLDOMNode

'Check if XMLDoc is loaded
If Not g_objclsXMLfile.FileLoaded Then Exit Sub

'Get RuleLIST Node
Set RuleList = g_objclsXMLfile.xmlDocument.getElementsByTagName("RULELIST").Item(0)
'Create New Rule
Set Rule = g_objclsXMLfile.xmlDocument.createElement("RULE")
'Add all attributes
Call SetRuleAttributes(NewRule, Rule)
'Append the new Rule
Call RuleList.appendChild(Rule)

'nieuw!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Set Rule = g_objclsXMLfile.xmlDocument.getElementsByTagName("RULE").Item(0)
Set Term = g_objclsXMLfile.xmlDocument.createElement("TERM")
'Set attributes for term
'Call SetTermAttributes(NewTerm, Term)

Call Rule.appendChild(Term)





Exit Sub
ErrorHandler:
Call MsgBox("Rule " & NewRule.RuleName & " not added " & Chr(13) & _
"Probably the rule alread exists")
End Sub

Wat doe ik fout?

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

offtopic:
Ik werk zelf ook al een tijdje aan een expertsysteem en vraag me af waarom je die rulebase wilt maken in XML? Je wilt AST`s die gevormd worden door de rulebase persistent maken? Dan had je toch ook die rulebase opnieuw kunnen parsen? Ik vind dit een stuk beter te lezen:

a:=10+20

ipv
[code]
<assign>
<variable>a</variable>
<expression>
<plus>
<left>
<value>10</value>
</left>
<right>
<value>20</value>
</right>
</plus>
</expression>
</assign>[/code]
niet aanvallend bedoelt trouwens, maar ben er gewoon in geinteresseerd.

  • Devil
  • Registratie: Oktober 2001
  • Niet online

Devil

King of morons

Op woensdag 20 maart 2002 18:17 schreef L.ende een hele roman:
Kun je het niet beter 'gewoon' doen. Dus de xml openen als tekstbestand, zoeken naar de laatste </rule> tag en dan daar de nieuwe rule 'inserten'?

After all, we are nothing more or less than what we choose to reveal.


Verwijderd

Topicstarter
offtopic:
Ik ben bezig met een GUI die rules moet bouwen.
Deze rules gaan via een front-end naar een back-end met een flop. Op de flop staat deze XML die door de back-end moet worden gelezen.

Geen idee wat je bedoeld maar misschien heb je er wat aan.

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Op woensdag 20 maart 2002 18:35 schreef L.ende het volgende:
offtopic:
Ik ben bezig met een GUI die rules moet bouwen.
Deze rules gaan via een front-end naar een back-end met een flop. Op de flop staat deze XML die door de back-end moet worden gelezen.

Geen idee wat je bedoeld maar misschien heb je er wat aan.
offtopic:
Een van onze stagaires is op dit moment ook bezig om rules te maken op basis van (gui)beslisbomen. De beslisboom die genereerd 'normaal' formaat omdat die parser ook al gebruikt wordt voor het handmatige gedeelte. En mensen moeten kunnen zien wat voor 'normale' rules ze maken.

Misschien kunnen we wat ideeen uitwisselen?

ps: we moeten trouwens ook beslis bomen kunnen maken op basis van rules.

Verwijderd

Topicstarter
offtopic:
wellicht!
ik mail je nu wel even op je hotmail account.

Verwijderd

[ontopic ;)]

Het is logisch dat ie dit ervan maakt, want je voegt immers geen elementen aan Term toe. Dus sluit hij hem direct (<Term blaat="iets"/>).

Als je Operand Nodes aanmaakt, en deze toevoegd aan de Term node, zal hij wel een </term> genereren :)

[/ontopic :? >:)]

Verwijderd

Topicstarter
Misschien een rare vraag maar: Hoe doe ik dat dan?
Dit staat niet in de voorbeelden die ik kan vinden.

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/xmlsdk30/htm/xmmscxmldomproperties.asp

Verwijderd

mischien iets van:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'nieuw!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Set Rule = g_objclsXMLfile.xmlDocument.getElementsByTagName("RULE").Item(0)
Set Term = g_objclsXMLfile.xmlDocument.createElement("TERM")
'Set attributes for term
'Call SetTermAttributes(NewTerm, Term)

'**********
Set Operand = {new Node}
Operand.Text = "blaat"
Call Term.appendChild(Operand)
'**********


Call Rule.appendChild(Term)

:?, of denk ik nu te simpel :?

Verwijderd

Topicstarter
Op woensdag 20 maart 2002 20:28 schreef KoenM het volgende:
:?, of denk ik nu te simpel :?
Helaas wel denk ik. Ben nu al een dik half uur verder en het wil me maar niet lukken. Iemand anders een idee?

  • Banpei
  • Registratie: Juli 2001
  • Laatst online: 11-09 16:51
Ik ken het probleem. Ik heb er ongeveer 3 uur naar lopen zoeken vorige week omdat op alle voorbeelden op site alleen staat hoe je een rootnode maakt. Lekker makkelijk om van elkaar de voorbeelden over te nemen.

Uiteindelijk heb ik het toch gevonden (helaas heb ik alleen de link op mijn werk) op een site en daarna was het wel erg makkelijk om te maken. Je moet eerst een xmlElement object maken (tijdelijk) en daar alle childs aan appenden (dus ook de textnodes e.d.), dus zelfs als je de attributen voor TERM zet zal ie em nog niet netjes afsluiten (maar dat maakt geen ruk uit voor de xml parser want hij kan het prima uitlezen overigens), dus zul je eerst de childs allemaal moeten toevoegen...
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Set Rule = g_objclsXMLfile.xmlDocument.getElementsByTagName("RULE").Item(0)

-------------------------
'Dit is hoe ik het heb gedaan uit het blote hoofd, dus niet slaan als er fouten in staan... :P

'Nieuwe child term aanmaken
Set objNewTerm = g_objclsXMLfile.createElement("TERM") 

'Operator attribuut aanmaken en vullen
Set objNewTermAttrib = objNewTerm.createAttribute("Operator")
objNewTerm.setAttribute "Operator", "OR"

'Child van Term aanmaken genaamd Value en daarin de text plaatsen
Set objNewNodeValue = objXMLDoc.createElement("VALUE")
Set objNewNodeValueText = objXMLDoc.createTextNode("20") 

'Append de text aan de Value
objNewTermValue.appendChild(objNewTermValueText) 

'Append Value aan Term
objNewTerm.appendChild(objNewTermValue)

'Append Term aan de node waarin je em wilde hebben...
Rule.appendChild(objNewTerm)
-------------------------

Ik zal morgen ochtend even de link plaatsen... *D


Edit: Oeps... Foutje in een van de variablen... |:(

  • Banpei
  • Registratie: Juli 2001
  • Laatst online: 11-09 16:51
Hier de beloofde link... :P
Pagina: 1