Jag har en kod som hämtar noder från en XML-fil för att skriva dem till en databas. Problemet är att i XML-filen finns det noder med samma namn under noden <TEST>. Jag tycker att det hörs på namnet att SelectSingleNode() bara väljer ut en enda nod. Det måste finnas någon funktion för att hämta ut alla noder av en viss typ och sedan loopa över dem. Precis så tänker jag också men jag vet inte hur man ska översätta detta i praktiken. Nu hittar jag inte min riktiga kod bara det jag använde för test, så se om det funkar Jag provade din lösning Hendrik men fick det inte riktigt att fungera, tyvärr. Jag har inte haft tillgång till utvecklingsmiljön just nu men borde du inte kunna använda något liknande detta. Först vill jag säga att jag varken använder den XML-struktur eller data som jag tagit med i mitt inlägg. Koden har bara samma struktur men i ett enklare format för att kunna finna en lösning på enklaste sätt. Jag provade din metod Ola, och det ser ju ut att vara korrekt men jag får ändå följande felmeddelande:Problem med att ta ut data från XML-fil!
Alla andra värden får jag ut utan problem men ur <NODTRE> får jag bara ut första värdet.
Hur gör jag för att få ut alla värden från dessa noder?
Tacksam för all hjälp och alla tips jag kan få!
Datan i XML-filen ser ut som följande:
<code>
<TEST>
<NODETT>Text1a</NODETT>
<NODTVA>Text2a</NODTVA>
<NODTRE>Text3a</NODTRE>
<NODTRE>Text3b</NODTRE>
<NODTRE>Text3c</NODTRE>
</TEST>
<TEST>
<NODETT>Text1a</NODETT>
<NODTVA>Text2a</NODTVA>
<NODTRE>Text3a</NODTRE>
<NODTRE>Text3b</NODTRE>
<NODTRE>Text3c</NODTRE>
</TEST>
</code>
Utdrag ur koden:
<code>
Set xml = Server.CreateObject("MSXML2.DOMDocument")
xml.Load server.mappath("filen.xml")
Set noder = xml.selectNodes("//TEST")
For i = 0 To noder.length -1
StringNODETT = noder(i).SelectSingleNode("NODETT").text
StringNODTVA = noder(i).SelectSingleNode("NODTVA").text
StringNODTRE = noder(i).SelectSingleNode("NODTRE").text
next
</code>Sv: Problem med att ta ut data från XML-fil!
Sv:Problem med att ta ut data från XML-fil!
Man får snickra in en loop i loopen som tar ut värdena för varje <NODTRE> i aktuell <TEST> men hur koden ska skrivas vet jag inte.
Några förslag?Sv:Problem med att ta ut data från XML-fil!
<code>
dim objXML
dim objLst
dim trow
dim tcol
dim i, j
set objXML = CreateObject("Microsoft.XMLDOM")
set objLst = CreateObject("Microsoft.XMLDOM")
objXML.async = false
objXML.LoadXML("test2.xml") 'strXML
response.write(GetXMLnode("testxml"))
function GetXMLnode(GetNode)
set objLst = objXML.getElementsByName(GetNode)
GetXMLnode = objLst.item(0).text
end function
function GetXMLnodes(GetNode)
'*** Levererar svaren med ; separation
set objLst = objXML.getElementsByTagName("QuantityInStock")
for i = 0 to (objLst.length - 1)
tmp = tmp & ";" & objLst.item(i).text
next
GetXMLnodes = tmp
end function
</code>Sv: Problem med att ta ut data från XML-fil!
Problemet är att jag har först en loop som går igenom alla <TEST> taggar sedan måste jag göra en loop som går igenom alla <NODTRE> i den aktuella <TEST> taggen. Så här provade jag med din lösning.
Det kanske inge går att skapa ett nytt objekt på det sätt som jag gjort, eller?
Tacksam för all hjälp jag kan få.
Så här provade jag att implementera ditt förslag:
<code>
Set xml = Server.CreateObject("MSXML2.DOMDocument")
xml.Load server.mappath("filen.xml")
Set noder = xml.selectNodes("//TEST")
For i = 0 To noder.length -1
StringNODETT = noder(i).SelectSingleNode("NODETT").text
StringNODTVA = noder(i).SelectSingleNode("NODTVA").text
StringNODTRE = noder(i).SelectSingleNode("NODTRE").text
'Här satte jag in en loop i loopen som ska gå igenom samtliga NODTRE i aktuell TEST
StringNODTRE = ""
set nodertest = CreateObject("Microsoft.XMLDOM")
set nodertest = noder(i).getElementsByTagName("NODTRE")
For j = 0 to nodertest.length -1
StringNODTRE = StringNODTRE & vbCrLf & nodertest.item(j).text
next
next
</code>Sv:Problem med att ta ut data från XML-fil!
<code>
Set xml = Server.CreateObject("MSXML2.DOMDocument")
xml.Load server.mappath("filen.xml")
Set noder = xml.selectNodes("//TEST")
For i = 0 To noder.length -1
Select Case noder(i).Name
Case "NODETT"
StringNODETT = noder(i).Text
Case "NODTVA"
StringNODTVA = noder(i).Text
Case "NODTRE"
StringNODTRE = StringNODTRE & vbCrLf & noder(i).Text
End Select
Next
</code>
Sen kan man ha en del funderingar på strukturen på XML-fil och på vad du ska göra i programmet men förslaget bör lösa ditt specade problem.Sv: Problem med att ta ut data från XML-fil!
Jag tittade på din lösning Jan och insåg att det inte går att få ut korrekt data på detta sätt.
noder(i).Name kommer nämligen vara TEST eftersom det är under denna nod som datan ska hämtas. Alltså, det är under-taggarna till taggen <TEST> som kommer plockas ut i loopen.
Problemet är att det finns flera noder/taggar under <TEST> som heter samma sak alltså <NODTRE> därför hämtar den bara den första när jag tar ut dem med:
StringNODTRE = noder(i).SelectSingleNode("NODTRE").text
Jag behöver alltså en metod för att loopa igenom alla NODTRE i den aktuella TEST-taggen som huvud-loopen loopar igenom.
Jag hoppas att ni förstår vad jag menar.
Ungefär så här:
BÖRJAN PÅ HUVUDLOOP - LOOPA IGENOM ALLA <TEST> OCH TA UT DESS UNDERVÄRDEN
TA UT NODETT TILL STRÄNG-VARIABEL
TA UT NODTVÅ TILL STRÄNG-VARIABEL
BÖJAN NODTRE-LOOP
LÄGGA IHOP ALLA NODTRE-TAGGAR TILL EN STRÄNG-VARIABEL
SLUT NODTRE-LOOP
SLUT PÅ HUVUDLOOP
Tack för att ni engagerar er i problemet allihopa!Sv:Problem med att ta ut data från XML-fil!
Du har ju i princip koden som löser problemet i din första loop..
Så här bör det bli ungefär:
Set noder2 = TESTNoden.selectNodes("NODTRE")
For i = 0 To noder2.length -1
noder2(i).text 'här loopas dina <NODTRE>
Next iSv: Problem med att ta ut data från XML-fil!
Object required: "[object]"