Avatar billede DMO Novice
12. juni 2017 - 13:32 Der er 6 kommentarer og
1 løsning

XML problem

jeg henter data fra XML men jeg får ikke det hele med
Den skipper den anden a:OrderLine, alt andet for den med uden problemer.
Hvorfor gør den det og hvad kan jeg gøre ved det?

vis jeg cutter det hele ned til det relevante kode. (ASP classic)
<%
//henter Xml text som string
...
...
Set objXML = Server.CreateObject("Msxml2.DOMDocument")
objXML.LoadXml(XMLTextstring)
If objXML.parseError.errorCode <> 0 Then
Response.Write "<p>Parse Error Reason: " & objXML.parseError.reason & "</p>"
Else
Set objXMLRoot = objXML.documentElement
...
...
Set NodeList = objXMLRoot.getElementsByTagName("m_Item2")
...
...
For i = 1 to NodeList.length
  call InsertOrderLine
Next
...
...
end if

Sub InsertOrderLine
  OrdreLine_Id = objXML.getElementsByTagName("a:OrderLine_Id")(i-1).Text
...
...
'indsætter data
end sub
...
...
---------------------------
XML ser nogenlunde sådan her ud
<m_Item1>
</m_Item1>
<m_Item2>
<a:OrderLine>
...
</a:OrderLine>
<a:OrderLine>
...
</a:OrderLine>
</m_Item2>
<m_Item3>
</m_Item3>
-------------------------------
Tror det ligger ved denne linje (For i = 1 to NodeList.length)
Avatar billede arne_v Ekspert
12. juni 2017 - 14:21 #1
OrdreLine_Id = objXML.getElementsByTagName("a:OrderLine_Id")(i-1).Text

getElementsByTagName returnerer vel en liste som du skal iterere over!?!?
Avatar billede DMO Novice
12. juni 2017 - 14:27 #2
OrdreLine_Id = objXML.getElementsByTagName("a:OrderLine_Id")(i-1).Text

returner data f.eks. 261
der er flere felter..

<m_Item1>
</m_Item1>
<m_Item2>
<a:OrderLine>
  <a:OrderLine_Id>261</a:OrderLine_Id>
  <a:OrderLine_name>Majs</a:OrderLine_name>
</a:OrderLine>
<a:OrderLine>
  <a:OrderLine_Id>262</a:OrderLine_Id>
  <a:OrderLine_name>Korn</a:OrderLine_name>
</a:OrderLine>
</m_Item2>
<m_Item3>
</m_Item3>
Avatar billede arne_v Ekspert
12. juni 2017 - 14:41 #3
Jeg tror altsaa stadig at du skal bruge noget a la:

OrdreLineList = objXML.getElementsByTagName("a:OrderLine_Id")
For i = 1 to OrdreLineList.length
    OrderLine = OrderLineList(i - 1)
    ' hent OrderLine_Id
    ' hent OrderLine_name
    ' process
Next
Avatar billede DMO Novice
12. juni 2017 - 15:03 #4
hm, Jeg forstår måske ikke.

mener du at min kode
Set NodeList = objXMLRoot.getElementsByTagName("m_Item2")
skal ændres til
OrdreLineList = objXML.getElementsByTagName("a:OrderLine_Id")
Avatar billede arne_v Ekspert
12. juni 2017 - 15:31 #5
Nej.

Det er:

OrdreLine_Id = objXML.getElementsByTagName("a:OrderLine_Id")(i-1).Text

som jeg mener er forkert.
Avatar billede arne_v Ekspert
12. juni 2017 - 17:33 #6

<all xmlns="http://localhost" xmlns:a="http://localhost/a">
    <m_Item1>
    </m_Item1>
    <m_Item2>
        <a:OrderLine>
            <a:OrderLine_Id>261</a:OrderLine_Id>
            <a:OrderLine_name>Majs</a:OrderLine_name>
        </a:OrderLine>
        <a:OrderLine>
            <a:OrderLine_Id>262</a:OrderLine_Id>
            <a:OrderLine_name>Korn</a:OrderLine_name>
        </a:OrderLine>
    </m_Item2>
    <m_Item2>
        <a:OrderLine>
            <a:OrderLine_Id>263</a:OrderLine_Id>
            <a:OrderLine_name>Majs</a:OrderLine_name>
        </a:OrderLine>
        <a:OrderLine>
            <a:OrderLine_Id>264</a:OrderLine_Id>
            <a:OrderLine_name>Korn</a:OrderLine_name>
        </a:OrderLine>
    </m_Item2>
    <m_Item3>
    </m_Item3>
</all>


og:


<%
Response.Write "<ul>" & vbCrLf
Set doc = CreateObject("MSXML.DOMDocument")
doc.Async = False
doc.Load(Server.MapPath("xml.xml"))
Set allitem2 = doc.SelectNodes("//m_Item2")
For Each item2 In allitem2
    Response.Write "<li>Item2:<ul>" & vbCrLf
    Set allorderline = item2.SelectNodes("a:OrderLine")
    For Each orderline in allorderline
        id = orderline.SelectSingleNode("a:OrderLine_Id/text()").NodeValue
        name = orderline.SelectSingleNode("a:OrderLine_name/text()").NodeValue
        Response.Write "<li>OrderLine:" & id & " " & name & "</li>" & vbCrLf
    Next
    Set allorderline = Nothing
    Response.Write "</ul></li>" & vbCrLf
Next
Set allitem2 = Nothing
Set doc = Nothing
Response.Write "</ul>" & vbCrLf
%>


giver:


<ul>
<li>Item2:<ul>
<li>OrderLine:261 Majs</li>
<li>OrderLine:262 Korn</li>
</ul></li>
<li>Item2:<ul>
<li>OrderLine:263 Majs</li>
<li>OrderLine:264 Korn</li>
</ul></li>
</ul>
Avatar billede DMO Novice
13. juni 2017 - 09:13 #7
jeg rettede
Set NodeList = objXMLRoot.getElementsByTagName("m_Item2")
til
Set NodeList = objXMLRoot.getElementsByTagName("a:OrderLine_id")
der er kun en m_item2 og gør at den kun "loop" en gang, mens der er flere OrderLine_id

Arnes kode er helt rigtig og det fik mig til at se min fejl.

tak for hjælp
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