webForumDet fria alternativet

Göra liknande SQL-frågor till XML?

20 svar · 921 visningar · startad av oskars

oskarsMedlem sedan nov. 20051 317 inlägg
#1

Hejsan!

Jag har en XML-fil med massa olika poster, likt en databas.

Kan jag på göra så här med den:

* Enbart skriva ut alla poster där t.ex <titel></title> = "Mr"
* Och om titel = "Mr" så vill jag köra en annan If-sats!

Går det?

Tacksam för hjälp!

Mvh
Oskar

@ndersMedlem sedan juni 200032 969 inlägg
#2

Ja, det är klart det går.
Vad vill du använda för teknik?

oskarsMedlem sedan nov. 20051 317 inlägg
#3

Jag kan ASP, så det är kanske där jag vill börja?

Jag vill leta i min XML-fil efter poster som har en speciell text i sig.. och för varje sådan post så vill jag uppdatera min mysql-databas med ytterligare lite information från posten.

Typ så här:

If XML_Titel = "Mr" Then
Uppdatera min MySQL-databas med värdena från XML_Titel och XML_Namn
Else kolla igenom nästa post
End If

@ndersMedlem sedan juni 200032 969 inlägg
#4

Snabbt exempel:

XML-fil som heter foo.xml:

<Customers>
	<Customer>
		<Person name="Pelle" title="Mr" />
	</Customer>
	<Customer>
		<Person name="Mange" title="Mr" />
	</Customer>
	<Customer>
		<Person name="Petra" title="Ms" />
	</Customer>
</Customers>

ASP-kod (denna kod skriver just nu bara ut namnet på personen med titel Mr)

set oDOM = server.createobject("msxml2.domdocument")
oDOM.load server.mappath("foo.xml")

set oNodeList = oDOM.SelectNodes("//Person[@title='Mr']")
for each oNode in oNodeList
    sName = oNode.getAttribute("name")
    Response.Write sName & "<br/>"
next

set oNodeList = nothing
set oDOM = nothing
oskarsMedlem sedan nov. 20051 317 inlägg
#5

Ooh, grymt! Men om det ser ut så här då:

<name>Retur</name>

och inte <name namn="Retur" />

=)

@ndersMedlem sedan juni 200032 969 inlägg
#6

Ok, om xml:en då ser ut typ:

<Customers>
	<Customer>
		<Person title="Mr"><Name>Pelle</Name></Person>
	</Customer>
	<Customer>
		<Person title="Mr"><Name>Mange</Name></Person>
	</Customer>
	<Customer>
		<Person title="Ms"><Name>Petra</Name></Person>
	</Customer>
</Customers>

, så kan asp-koden se ut typ:

set oDOM = server.createobject("msxml2.domdocument")
oDOM.load server.mappath("foo.xml")

set oNodeList = oDOM.SelectNodes("//Person[@title='Mr']/Name")
for each oNode in oNodeList
    sName = oNode.text '.getAttribute("name")
    Response.Write sName & "<br/>"
next

set oNodeList = nothing
set oDOM = nothing

Det bästa vore nog om du visade exempel på hur din xml-fil ser ut.

oskarsMedlem sedan nov. 20051 317 inlägg
#7

Så här ser den ut (fast nu visar jag bara 1st post):

Jag har fetlagt dom fälten som jag vill få ut till typ variabler!

Tack för att du tar dig tid!!

<?xml version="1.0" encoding="ISO-8859-1"?>
<invoicespecification>
	<number>8</number>
	<date>20</date>
	<type>Kolli</type>
	<issuer>
		<name>Posten</name>
		<address>
			<postcode>105</postcode>
			<city>Stockholm</city>
		</address>
	</issuer>
	<invoicee>
		<id>1</id>
		<name>W</name>
		<address>
			<street>L40</street>
			<postcode>12</postcode>
			<city>BA</city>
			<countrycode>SE</countrycode>
		</address>
	</invoicee>
	<parcels>
		<orderitem>
			<locationcode>P0</locationcode>
			<locationname>DIP</locationname>
			<code>1</code>
			<name>Postpaket (25)</name>
			<parcelid>84SE</parcelid>
			[blue][B]<reference>1234</reference>[/B][/blue]
			<date>22</date>
			<consignee>
				<postcode>1</postcode>
				<city>BA</city>
				<countrycode></countrycode>
			</consignee>
			<weight>3.700</weight>
			<volume>0.044</volume>
			<chargeableweight>12.3</chargeableweight>
			<samtax></samtax>
			[blue][B]<price>79.00</price>[/B][/blue]
			<vatflag></vatflag>
			<consignor>
				<id></id>
				<name></name>
			</consignor>
			<suplementary>
				<code>16</code>
				[blue][B]<name>Retur</name>[/B][/blue]
				[blue][B]<price>0.00</price>[/B][/blue]
				<vatflag></vatflag>
			</suplementary>
		</orderitem>
	</parcels>
</invoicespecification>
oskarsMedlem sedan nov. 20051 317 inlägg
#8

Tror att jag hajjar det nu, men jag får ändå inte det här att funka:

<%
	set oDOM = server.createobject("msxml2.domdocument")
	oDOM.load server.mappath("minXML.xml")
	
	set oNodeList = oDOM.SelectNodes("//invoicespecification/parcels/orderitem/suplementary/name")
	for each oNode in oNodeList
		
	    sName = oNode.text '.getAttribute("name")
	    
	    If InStr(sNamn,"Retur") Then
	    	Response.Write sName & "<br/>"
	    End If
	    
	next
	
	set oNodeList = nothing
	set oDOM = nothing
%>

Jag föstår nu hur jag skriver ut alla värden från ett speciellt fält (eller vad kallar man det)... men hur gör jag för att leta upp alla som har värdet "Retur" i valt name-fält... och för varje post som har värdet "Retur" så ska jag även leta upp värdena i dom fet-markerade fälten?

Hoppas jag inte förklarar det alltför snurrigt!

@ndersMedlem sedan juni 200032 969 inlägg
#9

Du får nog läsa på lite om alla metoder och egenskaper som MSXML tillhandahåller, men så här hade jag gjort:

set oDOM = server.createobject("msxml2.domdocument")
oDOM.load server.mappath("foo.xml")

set oNodeList = oDOM.SelectNodes("/invoicespecification/parcels/orderitem")
for each oNode in oNodeList
    sRef = ""
    sPrice = ""
    sName = ""
    sSupPrice = ""

    set oName = oNode.selectSingleNode("suplementary").selectSingleNode("name")
    if not oName is nothing then
        sName = oName.text
    end if
    
    if sName = "Retur" then
        set oReference = oNode.selectSingleNode("reference")
        if not oReference is nothing then
            sRef = oReference.text
        end if
        set oPrice = oNode.selectSingleNode("price")
        if not oPrice is nothing then
            sPrice = oPrice.text
        end if
        set oSupPrice = oNode.selectSingleNode("suplementary").selectSingleNode("price")
        if not oSupPrice is nothing then
            sSupPrice = oSupPrice.text
        end if
        
        Response.Write "Reference: " & sRef & "<br/>"
        Response.Write "Price: " & sPrice & "<br/>"
        Response.Write "Suppl. name: " & sName & "<br/>"
        Response.Write "Suppl. price: " & sPrice & "<br/>"
    end if
    
    set oReference = Nothing
    set oPrice = Nothing
    set oName = Nothing
    set oSupPrice = Nothing
next

set oNodeList = nothing
set oDOM = nothing
oskarsMedlem sedan nov. 20051 317 inlägg
#10

Du är grym! Återigen tack tack!!!

Men när jag försöker koppla det till databasen så hittar den inga i tabellen Arkiv där Ordernummer är = sRef... fattar inte varför... alla posterna som den ska leta efter i tabellen finns, men den hittar dom inte... Med att "den inte hittar" så menar jag att den hela tiden lämnar variabeln sID tom... Med andra ord så är RecSet EOF hela tiden... fattar inte varför

	    If sName = "Retur" Then
	    
	        Set oReference = oNode.selectSingleNode("reference")
	        If NOT oReference IS NOTHING Then
	            sRef = oReference.text
	            			
				
			
	        End If
	        
	        Set oPrice = oNode.selectSingleNode("price")
	        If NOT oPrice IS NOTHING Then
	            sPrice = oPrice.text
	        End If
	        
	        Set oSupPrice = oNode.selectSingleNode("suplementary").selectSingleNode("price")
	        If NOT oSupPrice IS NOTHING Then
	            sSupPrice = oSupPrice.text
	        End If
	        
	        getDatabase = "DRIVER={MySQL ODBC 3.51 Driver}; SERVER=localhost; DATABASE=; UID=;PASSWORD=;OPTION=3"
	
			Set Connect = Server.CreateObject("ADODB.Connection")
			Connect.Open = getDatabase
			
			Set Recset = Server.CreateObject("ADODB.Recordset")
			SQL = "SELECT * FROM Arkiv WHERE Ordernummer = "&Int(sRef)&""
			RecSet.Open SQL, Connect, 1, 2

			If NOT RecSet.EOF Then		
				sID = RecSet("sID")
			End If
	
		    Set Connect = NOTHING
		    Set RecSet = NOTHING
				
	        Response.Write "Säljare: "&sID &"<br/>"
	        Response.Write "Reference: "&sRef&"<br/>"
	        Response.Write "Price: "&sPrice&"<br/>"
	        Response.Write "Suppl. name: "&sName&"<br/>"
	        Response.Write "Suppl. price: "&sPrice&"<br/>"
	        Response.Write "<br/>"
	    End If
@ndersMedlem sedan juni 200032 969 inlägg
#11

Om du skriver ut SQL-frågan - ser det rätt ut då?

oskarsMedlem sedan nov. 20051 317 inlägg
#12

ja den gör ju det... den skriver ut så här:

SELECT * FROM Arkiv WHERE Ordernummer = 273
@ndersMedlem sedan juni 200032 969 inlägg
#13

Och om du kör den på något annat vis - typ direkt i databasen med något lämpligt verktyg - då fungerar den?

(och - sluta genast att lägga till tomma strängar sist sql-frågor och annat.)

oskarsMedlem sedan nov. 20051 317 inlägg
#14

Om jag kör den i ett annat verktyg så funkar den frågan ja! Kan det vara fel på typ anslutningen eller något? Får jag inte köra SQL-frågor i en For-sats?

*försöker snällt sluta*

@ndersMedlem sedan juni 200032 969 inlägg
#15

Får jag inte köra SQL-frågor i en For-sats?

Jodå, men det känns kanske dumt att skapa och förstöra connectionobjektet inne i for-slingan.

Lyft ut detta:

		        getDatabase = "DRIVER={MySQL ODBC 3.51 Driver}; SERVER=localhost; DATABASE=; UID=;PASSWORD=;OPTION=3"

			Set Connect = Server.CreateObject("ADODB.Connection")
			Connect.Open getDatabase
			
			Set Recset = Server.CreateObject("ADODB.Recordset")
			SQL = "SELECT * FROM Arkiv WHERE Ordernummer = 273"
			RecSet.Open SQL, Connect, 1, 2

			If NOT RecSet.EOF Then		
				sID = RecSet("sID")
			End If
	
		    Set Connect = NOTHING
		    Set RecSet = NOTHING

och kör den koden för sig själv. Notera att du inte ska ha = efter connect.open. Det är en metod, inte en egenskap.

oskarsMedlem sedan nov. 20051 317 inlägg
#16

Okej okej, du vinner. Den hittar ingenting. Men varför gör den inte det? Hittar ju posten i mitt mysql-managerprogram.... hmm...

@ndersMedlem sedan juni 200032 969 inlägg
#17

Kör du mot samma databas då?

oskarsMedlem sedan nov. 20051 317 inlägg
#18

OMG. OMG. Den letar ju efter LOCALHOST! Jag sitter ju för ovanlighetens skull inte på serverdatorn och kodar nu. Gud, vad jag skäms!! Åååh, nu funkar det ju! Shit vad vackert! ....FANTASTISKT! Förlåt att jag tabbade mig så!

Du är jävligt bra på det du gör asså! Tack så jävla mycket !!!!
Jag ska sätta mig in mer i det här med MSXML nu... försöka i alla fall! Du har gett mig en bra grund att stå på! Tack!

@ndersMedlem sedan juni 200032 969 inlägg
#19

Varsågod - roligt att du fick ihop det!
Lycka till med resten!

oskarsMedlem sedan nov. 20051 317 inlägg
#20

Fast det var ju mest du =)

En liten lustig grej är att den hittar inte alla som har <name>Retur</name>

Det ska finnas 12st, men den hittar bara 9st...

jag har kollat genom den själv... ska fortsätta nu igen!

Nu hittade jag nog det...

Problem som kan uppstå:


			<suplementary>
				<code>201</code>
				<name>Avsaknad av föravisering via EDI</name>
				<price>0.00</price>
				<vatflag></vatflag>
			</suplementary>
			<suplementary>
				<code>106</code>
				<name>Retur</name>
				<price>0.00</price>
				<vatflag></vatflag>
			</suplementary>

Det kan alltså finnas 2st suplementary... inte konstigt att den inte hittar alla då... Hur ska jag göra?

Det verkar som att <code></code> alltid är 106 om det är en Retur! Kan jag använda det på något sätt?

139 ms totalt · 3 externa anrop · v20260731065814-full.fb544a5a
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
135 ms — hämta tråd, inlägg och bilagor (db)