---
title: "Göra liknande SQL-frågor till XML?"
type: "forum-thread"
url: "https://www.webforum.nu/amne/xml/164841-göra-liknande-sql-frågor-till-xml"
topic: "XML"
topic_url: "https://www.webforum.nu/amne/xml"
author: "oskars"
published: "2007-09-25T08:26:48.000Z"
updated: "2007-09-26T09:49:58.000Z"
replies: 20
views: 985
page: 1
pages: 2
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/xml/164841-göra-liknande-sql-frågor-till-xml"
---

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

_Sida 1 av 2._

## #1 — oskars, 2007-09-25T08:26Z

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

Permalänk: https://www.webforum.nu/p/164841

## #2 — @nders, 2007-09-25T08:29Z

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

Permalänk: https://www.webforum.nu/p/2034186

## #3 — oskars, 2007-09-25T08:32Z

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

Permalänk: https://www.webforum.nu/p/2034187

## #4 — @nders, 2007-09-25T08:53Z

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
```

Permalänk: https://www.webforum.nu/p/2034196

## #5 — oskars, 2007-09-25T11:29Z

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

\<name\>Retur\</name\>

och inte \<name namn="Retur" /\>

\=)

Permalänk: https://www.webforum.nu/p/2034253

## #6 — @nders, 2007-09-25T11:45Z

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.

Permalänk: https://www.webforum.nu/p/2034264

## #7 — oskars, 2007-09-26T06:31Z

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>
```

Permalänk: https://www.webforum.nu/p/2034529

## #8 — oskars, 2007-09-26T06:42Z

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!

Permalänk: https://www.webforum.nu/p/2034533

## #9 — @nders, 2007-09-26T06:58Z

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
```

Permalänk: https://www.webforum.nu/p/2034536

## #10 — oskars, 2007-09-26T08:12Z

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
```

Permalänk: https://www.webforum.nu/p/2034570

## #11 — @nders, 2007-09-26T08:18Z

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

Permalänk: https://www.webforum.nu/p/2034573

## #12 — oskars, 2007-09-26T08:20Z

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

```
SELECT * FROM Arkiv WHERE Ordernummer = 273
```

Permalänk: https://www.webforum.nu/p/2034575

## #13 — @nders, 2007-09-26T08:22Z

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.)

Permalänk: https://www.webforum.nu/p/2034577

## #14 — oskars, 2007-09-26T08:24Z

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\*

Permalänk: https://www.webforum.nu/p/2034578

## #15 — @nders, 2007-09-26T08:30Z

> 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.

Permalänk: https://www.webforum.nu/p/2034579

## #16 — oskars, 2007-09-26T08:35Z

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

Permalänk: https://www.webforum.nu/p/2034581

## #17 — @nders, 2007-09-26T08:36Z

Kör du mot samma databas då?

Permalänk: https://www.webforum.nu/p/2034583

## #18 — oskars, 2007-09-26T08:42Z

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!

Permalänk: https://www.webforum.nu/p/2034585

## #19 — @nders, 2007-09-26T08:49Z

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

Permalänk: https://www.webforum.nu/p/2034588

## #20 — oskars, 2007-09-26T09:25Z

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?

Permalänk: https://www.webforum.nu/p/2034592

---

Tråden på webben: https://www.webforum.nu/amne/xml/164841-göra-liknande-sql-frågor-till-xml  
Nästa sida: https://www.webforum.nu/amne/xml/164841-göra-liknande-sql-frågor-till-xml/page2.md
