oskarsMedlem sedan nov. 20051 317 inlägg 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 Ja, det är klart det går.
Vad vill du använda för teknik?
oskarsMedlem sedan nov. 20051 317 inlägg 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 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 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 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 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 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 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 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 Om du skriver ut SQL-frågan - ser det rätt ut då?
oskarsMedlem sedan nov. 20051 317 inlägg 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 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 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
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 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 Kör du mot samma databas då?
oskarsMedlem sedan nov. 20051 317 inlägg 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 Varsågod - roligt att du fick ihop det!
Lycka till med resten!
oskarsMedlem sedan nov. 20051 317 inlägg 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?