Avatar billede stalle Nybegynder
07. juni 2009 - 16:23 Der er 8 kommentarer og
1 løsning

VBS gemmer nye tags som én streng

Hej Eksperter.

Jeg sidder og roder med noget VBS, jeg bruger til at generere en XML-fil.
Alt sammen virker for så vidt også efter planen.
Alt bliver placeret korrekt, og virker efter hensigten.

Mit "problem" er, at når jeg har lavet min XML-fil, kan jeg ikke undgå og skulle ind og lave noget redigering af selv samme.
"Problemet" består så i, at min almindelige teksteditor, (som er det der er tilgængeligt, så forslag til XML-viewers etc. kan ikke rigtig bruges) viser det tilføjede som én streng. Altså ligger det hele på én linie i min fil.

Er der et "trick" til og gøre så min tags bliver gemt korrekt.

Eks:
Sådan skulle det gerne se ud:
<type>
<style>
<tag name="bla"/>
</style>
</type>

<type>
<style>
<tag name="blabla"/>
</style>
</type>

<type>
<style>
<tag name="blablabla"/>
</style>
</type>

Sådan ser det ud når jeg har lavet filen:
<type><style><tag name="bla"/></style></type><type><style><tag name="blabla"/></style></type><type><style><tag name="blablabla"/></style></type>
Avatar billede thesurfer Nybegynder
07. juni 2009 - 18:16 #1
Jeg forstår ikke helt hvordan du genererer XML-delen..

Jeg kan se 2 ting:

1) roder med noget VBS, jeg bruger til at generere en XML-fil

2) min almindelige teksteditor


Mine spørgsmål er:

A) Hvad er det der genererer XML-delen?

B) Hvad er det der evt gemmer XML-filen?


Hvis det er din VBS kode der genererer XML-delen, og f.eks. ser således ud:

streng = ""
streng = streng & "<type>"
streng = streng & "<style>"
streng = streng & "<tag name = ""bla"">"
streng = streng & "</style>"
streng = streng & "</type>"

(eller ligende, prøver ikke at matche 100%)

mangler du at tilføje linieskiftet.. det ser sådan ud:

streng = ""
streng = streng & "<type>" & vbCrLf
streng = streng & "<style>" & vbCrLf
streng = streng & "<tag name = ""bla"">" & vbCrLf
streng = streng & "</style>" & vbCrLf
streng = streng & "</type>" & vbCrLf
streng = streng & vbCrLf

Hvis du gentager den blok, får du det rigtige output, som der ses i dit eksempel.
Avatar billede stalle Nybegynder
07. juni 2009 - 19:00 #2
Beklager manglende information.

Problemet er, at det du henviser til, er at jeg i princippet skal lave min XML-fil som var det en text fil.

Da jeg kan komme ud for, at jeg skal tilføje elementer til et tag, så bruger jeg MSXL2.DOMDocument 5.0 til at bygge
træet/noden op, og så gemme dette i min fil.

Eksempel vis:
set nodTriggerGroups = xdoc.documentelement.selectnodes("/batch/snapshot/triggers/trigger/triggergroups/triggergroup")

'Create document node <mes>'
set objNewMes = xdocsettings.createnode(1,"mes","")
objNewProcess.appendchild(objnewmes)


order = 1

   
strLog = strLog & vbcrlf & vbcrlf & "Tags added to Snapshot section:"
for each nodTriggerGroup in nodTriggerGroups
    TriggerGroupName = nodTriggerGroup.getattribute("name")

    for each nodTriggerTag in nodTriggerGroup.selectNodes("triggertags/triggertag")
        TriggerTagName = nodTriggerTag.getattribute("name")

        if not TriggerTagName = "" then
            set objNewTag = xdocsettings.createelement("tag")
            objNewTag.setattribute "name", TriggerTagName
            objNewTag.setattribute "order", order
            objNewMes.appendchild(objNewTag)
            strLog = strLog & vbcrlf & order & vbtab & TriggerTagName
            order = order+1
           
        end if
    next
next

if order = 1 then
    set objNewTag = xdocsettings.createelement("tag")
    objNewTag.setattribute "name", "NONE"
    objNewTag.setattribute "order", order
    objNewMes.appendchild(objNewTag)
end if


Sådan her skulle det gerne komme til at se ud:
Ovenstående kode, laver ikke alt det nedenstående, men det er for at give indblik i, hvordan jeg bygger min XML op

    <type name="Mandrel">
        <style length="29">
            <process name="Curring">
                <mes>
                    <tag name="Demould temperature R6000 1" order="1"/>
                    <tag name="Demould temperature R6000 2" order="2"/>
                    <tag name="Maksimal temperature R10000 1" order="3"/>
                    <tag name="Maksimal temperature R10000 2" order="4"/>
                </mes>
                <cur>
                    <tag name="Laminat R10000 1" order="1"/>
                    <tag name="Laminat R10000 2" order="2"/>
                    <tag name="Laminat R32000 1" order="3"/>
                    <tag name="Laminat R32000 2" order="4"/>
                </cur>
            </process>
        </style>
    </type>

Men når jeg tilføjer til filen, så ser det ud som:

<type name="Mandrel"><style length="29"><process name="Curring"><mes><tag name="Demould temperature R6000 1" order="1"/><tag name="Demould temperature R6000 2" order="2"/><tag name="Maksimal temperature R10000 1" order="3"/><tag name="Maksimal temperature R10000 2" order="4"/></mes><cur><tag name="Laminat R10000 1" order="1"/><tag name="Laminat R10000 2" order="2"/><tag name="Laminat R32000 1" order="3"/><tag name="Laminat R32000 2" order="4"/></cur></process></style></type>

Det der reelt sker, er at jeg hiver nogle informationer fra én XML fil, hvilket så danner grundlag for fremtidig analyse af lignende XML-filer.

Som sagt, så bygger jeg min struktur op vha MSXML2 i mit VBS, da jeg kan komme ud for, at jeg skal tilføje endnu et process tag med dertilhørende tags, til en eksisterende type. Det jeg så vil ende ud med, er fx:

    <type name="Mandrel">
        <style length="29">
            <process name="Curring">
                <mes>
                    <tag name="Demould temperature R6000 1" order="1"/>
                    <tag name="Demould temperature R6000 2" order="2"/>
                    <tag name="Maksimal temperature R10000 1" order="3"/>
                    <tag name="Maksimal temperature R10000 2" order="4"/>
                </mes>
                <cur>
                    <tag name="Laminat R10000 1" order="1"/>
                    <tag name="Laminat R10000 2" order="2"/>
                    <tag name="Laminat R32000 1" order="3"/>
                    <tag name="Laminat R32000 2" order="4"/>
                </cur>
            </process>
            <process name="Coating">
                <mes>
                    <tag name="Demould temperature R6000 1" order="1"/>
                    <tag name="Demould temperature R6000 2" order="2"/>
                    <tag name="Maksimal temperature R10000 1" order="3"/>
                    <tag name="Maksimal temperature R10000 2" order="4"/>
                </mes>
                <cur>
                    <tag name="Laminat R10000 1" order="1"/>
                    <tag name="Laminat R10000 2" order="2"/>
                    <tag name="Laminat R32000 1" order="3"/>
                </cur>
            </process>
        </style>
    </type>

Når jeg så gemmer den struktur jeg har bygget op i det foregående VBS, så laver jeg en simpel .save på mit xdoc object.
Altså: xdoc.save("settings.xml")

Håber det giver lidt mere mening. I bund og grund er jeg ude efter og vide, om jeg med MSXML2 komponenten, kan få dannet en "pæn" fil, da den skal behandles/tjekkes efter endt udførelse af script. Evt. i notepad.
Avatar billede softspot Forsker
07. juni 2009 - 22:43 #3
Der er ikke umiddelbart en egenskab på DOM-objektet der kan foranledige denne formatering, men der er måse hjælp at hente i SAX. Du kan finde et eksempel (godt nok i VB, men kan nok oversættes til VBS) her: http://msdn.microsoft.com/en-us/library/ms753769(VS.85).aspx
Avatar billede softspot Forsker
07. juni 2009 - 22:52 #4
ASP VBS-versionen ser således ud:

'Create a DOMDocument object.
Dim xmlDoc: set xmlDoc = Server.CreateObject("MSXML2.DOMDocument.6.0")
'Create the SAX reader.
Dim rdr: set rdr = Server.CreateObject("MSXML2.SAXXMLReader.6.0")
'Create the XML writer.
Dim wrt: set wrt = Server.CreateObject("MSXML2.MXXMLWriter.6.0")
'File number

'Load the DOM document.
xmlDoc.loadXML ("<doc><one>test1</one><two>test2</two></doc>")

'Set properties on the XML writer.
wrt.byteOrderMark = True
wrt.omitXMLDeclaration = True
wrt.indent = True

'Set the XML writer to the SAX content handler.
Set rdr.contentHandler = wrt
Set rdr.dtdHandler = wrt
Set rdr.errorHandler = wrt
rdr.putProperty "http://xml.org/sax/properties/lexical-handler", wrt
rdr.putProperty "http://xml.org/sax/properties/declaration-handler", wrt
'Parse the DOMDocument object.
rdr.parse xmlDoc

response.AddHeader "content-type", "text/plain"
response.Write wrt.output
response.End
Avatar billede arne_v Ekspert
08. juni 2009 - 02:18 #5
Der er flere forskellige løsninger.

Set doc = CreateObject("MSXML.DOMDocument")
Set one1 = doc.CreateElement("one")
one1.AppendChild(doc.CreateTextNode("A"))
Set one2 = doc.CreateElement("one")
one2.appendChild(doc.CreateTextNode("BB"))
Set one3 = doc.CreateElement("one")
one3.appendChild(doc.CreateTextNode("CCC"))
Set root = doc.CreateElement("all")
root.appendChild(one1)
root.appendChild(one2)
root.appendChild(one3)
doc.appendChild(root)
Set xsl = CreateObject("MSXML.DOMDocument")
xsl.Async = False
xsl.Load("fmt.xsl")
s = doc.TransformNode(xsl)
Set xsl = Nothing
Set doc = Nothing
Set fso = CreateObject("Scripting.FileSystemObject")
Set f = fso.OpenTextFile("foobar.xml", 2)
f.Write s
f.close
Set f = Nothing
Set fso = Nothing
' display foobar.xml
Set fso = CreateObject("Scripting.FileSystemObject")
Set f = fso.OpenTextFile("foobar.xml", 1)
alllines = f.ReadAll
f.Close
Set f = Nothing
Set fso = Nothing
WScript.Echo alllines

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

<xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>

<xsl:template match="@* | node()">
    <xsl:copy>
        <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

Set doc = CreateObject("MSXML.DOMDocument")
Set one1 = doc.CreateElement("one")
one1.AppendChild(doc.CreateTextNode("A"))
Set one2 = doc.CreateElement("one")
one2.appendChild(doc.CreateTextNode("BB"))
Set one3 = doc.CreateElement("one")
one3.appendChild(doc.CreateTextNode("CCC"))
Set root = doc.CreateElement("all")
root.appendChild(one1)
root.appendChild(one2)
root.appendChild(one3)
doc.appendChild(root)
Set rdr = CreateObject("MSXML2.SAXXMLReader")
Set wrt = CreateObject("MSXML2.MXXMLWriter")
wrt.Indent = True
wrt.OmitXMLDeclaration = True
Set rdr.ContentHandler = wrt
rdr.putProperty "http://xml.org/sax/properties/lexical-handler", wrt
rdr.Parse doc
s = wrt.Output
Set wrt = Nothing
Set rdr = Nothing
Set doc = Nothing
Set fso = CreateObject("Scripting.FileSystemObject")
Set f = fso.OpenTextFile("foobar.xml", 2)
f.Write s
f.close
Set f = Nothing
Set fso = Nothing
' display foobar.xml
Set fso = CreateObject("Scripting.FileSystemObject")
Set f = fso.OpenTextFile("foobar.xml", 1)
alllines = f.ReadAll
f.Close
Set f = Nothing
Set fso = Nothing
WScript.Echo alllines

Set doc = CreateObject("MSXML.DOMDocument")
Set one1 = doc.CreateElement("one")
one1.AppendChild(doc.CreateTextNode("A"))
Set one2 = doc.CreateElement("one")
one2.appendChild(doc.CreateTextNode("BB"))
Set one3 = doc.CreateElement("one")
one3.appendChild(doc.CreateTextNode("CCC"))
Set root = doc.CreateElement("all")
root.appendChild(doc.CreateTextNode(vbCrLf & "    "))
root.appendChild(one1)
root.appendChild(doc.CreateTextNode(vbCrLf & "    "))
root.appendChild(one2)
root.appendChild(doc.CreateTextNode(vbCrLf & "    "))
root.appendChild(one3)
root.appendChild(doc.CreateTextNode(vbCrLf))
doc.appendChild(root)
doc.Save("foobar.xml")
Set doc = Nothing
' display foobar.xml
Set fso = CreateObject("Scripting.FileSystemObject")
Set f = fso.OpenTextFile("foobar.xml", 1)
alllines = f.ReadAll
f.Close
Set f = Nothing
Set fso = Nothing
WScript.Echo alllines

Den første laver dog ikke indrykning (på trods af at den burde).
Avatar billede stalle Nybegynder
08. juni 2009 - 08:51 #6
SUPER

Jeg skulle lige tyde hvad det gik ud på, og kan se at

Set rdr = CreateObject("MSXML2.SAXXMLReader")
Set wrt = CreateObject("MSXML2.MXXMLWriter")
wrt.Indent = True
wrt.OmitXMLDeclaration = True
Set rdr.ContentHandler = wrt
rdr.putProperty "http://xml.org/sax/properties/lexical-handler", wrt
rdr.Parse doc
s = wrt.Output
Set wrt = Nothing
Set rdr = Nothing
Set doc = Nothing
Set fso = CreateObject("Scripting.FileSystemObject")
Set f = fso.OpenTextFile("foobar.xml", 2)
f.Write s
f.close

Var det jeg havde behov for.
Det er hermed implementeret og virker efter planen.

Da softspot reelt var først med den del af det, er det måske ham der skal have point. Ellers må i lige komme med et svar begge to.
Avatar billede softspot Forsker
08. juni 2009 - 10:34 #7
Velbekomme :-)
Avatar billede softspot Forsker
20. juni 2009 - 00:19 #8
Ping... :-)
Avatar billede softspot Forsker
08. juli 2009 - 17:42 #9
Tak for point :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester