Permalänk

Add i en XML-fil, asp.net med C#

Jag har ett problem, vet att det kanske inte är så avancerat men det krånglar sig alltid för mig.

Har en XML-fil med data, och jag vill lägga till noder, men vet inte hur jag ska göra. Har strängar som ska läggas in från en aspx sida, och behöver få till inskrivningen i filen.

Grund-fil:
<?xml version="1.0" encoding="utf-8" ?>
<root>
<info>
<id>nummer</id>
<name>nåt</name>
<info2>nåt</info2>
<info3>nåt</info3>
<info4>nåt</info4>
<info5>nåt</info5>
<include>0</include>
</info>
</root>

Sen ska man lägga till en till info tag:

<?xml version="1.0" encoding="utf-8" ?>
<root>
<info>
<id>nummer</id>
<name>nåt</name>
<info2>nåt</info2>
<info3>nåt</info3>
<info4>nåt</info4>
<info5>nåt</info5>
<include>0</include>
</info>
<info>
<id>nummer</id>
<name>nåt</name>
<info2>nåt</info2>
<info3>nåt</info3>
<info4>nåt</info4>
<info5>nåt</info5>
<include>0</include>
</info>
</root>

Nån som har nåt bra tips, mina försök med XMLDocument har inte lyckats bra

Visa signatur

[MSI SpeedSter-FA4][Pentium M 770@160*16][X800GTO2 LE][A-Data PC4300 2GB][Maxtor 300GB S-ATA 16MB][NEC ND-3520A IDE][Thermaltake Xaser Tsunami Svart Aluminium][Hiper Type R 480W] //Betty (Kung Pow) [Outdated]

Permalänk
Medlem

pröva detta.

try { XmlDocument xd = new XmlDocument(); xd.Load("dinfil.xml"); XmlDocumentFragment docFrag = xd.CreateDocumentFragment(); docFrag.InnerXml = "<info><id>nummer</id><name>namn</name><info2>2nåt</info2><info3>nåt</info3><include>0</include></info>" XmlNode currNode = xd.DocumentElement; currNode.InsertAfter(docFrag, currNode.LastChild); xd.Save("dinfil.xml"); } catch (Exception ex) { Response.Write(ex.ToString()); }

Permalänk

Tackar tackar

EDIT:

Finns det nåt sätt att ögna igenom xml filen, leta i alla id taggar efter om det finns nån likadan och om det finns ersättas i den istället?

Visa signatur

[MSI SpeedSter-FA4][Pentium M 770@160*16][X800GTO2 LE][A-Data PC4300 2GB][Maxtor 300GB S-ATA 16MB][NEC ND-3520A IDE][Thermaltake Xaser Tsunami Svart Aluminium][Hiper Type R 480W] //Betty (Kung Pow) [Outdated]

Permalänk
Medlem

har inte testat detta men borde fungera.

try { XmlDocument xd = new XmlDocument(); xd.Load("dinfil.xml"); XmlNodeList list = xd.DocumentElement.SelectNodes("info"); foreach (XmlNode node in list) { if (node.SelectSingleNode("id").InnerText == "ditt sökta id") { XmlDocumentFragment docFrag = xd.CreateDocumentFragment(); docFrag.InnerXml = "<info><id>nummer</id><name>namn</name><info2>2nåt</info2><info3>nåt</info3><include>0</include></info>"; xd.DocumentElement.ReplaceChild(docFrag, node); xd.Save("dinfil.xml"); break; } } } catch (Exception ex) { Response.Write(ex.ToString()); }

EDIT: haha. snygg tajming

EDIT2: Jag la till en fullständig lösning

Permalänk
Medlem

titta på xpath, ladda xmlfilen i ett XmlDocument därifrån kan du använda selectnodes och selectsinglenode

http://www.w3schools.com/xpath/default.asp rätt bra grund för xpath

Visa signatur

There are few problems that cannot be solved with the usage of high explosives
a64 X2@2.5ghz, 2gb ram, x1900xt

Permalänk

Haha, tackar båda.

Pucka, jag antar att du länkade till exakt samma sak som liquid_x.

EDIT: Det funka perfekt för att modifiera redan befintliga element, men att lägga till nya krånglar mer.
Jag skrev en else-sats för det ändamålet, men det resulterar i 2-3 nya element med samma info, och det även om id-taggens innehåll redan finns.

Visa signatur

[MSI SpeedSter-FA4][Pentium M 770@160*16][X800GTO2 LE][A-Data PC4300 2GB][Maxtor 300GB S-ATA 16MB][NEC ND-3520A IDE][Thermaltake Xaser Tsunami Svart Aluminium][Hiper Type R 480W] //Betty (Kung Pow) [Outdated]

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Betty (Kung Pow)
EDIT: Det funka perfekt för att modifiera redan befintliga element, men att lägga till nya krånglar mer.
Jag skrev en else-sats för det ändamålet, men det resulterar i 2-3 nya element med samma info, och det även om id-taggens innehåll redan finns.

ja, kodsnutten jag skrev är endast till för att se om ID:et finns och ersätta det om det gör det. men ska inte vara alltför för svårt att ändra till ditt ändamål. kan kolla på det när jag kommer hem ikväll.

Permalänk

Åh, tackar.
Jag har upptäckt att XML var ganska roligt att trilskas med
Har dock stora problem med att se kopplingar, och hur man ska lösa problem för tillfället, men det löser sig nog.

Visa signatur

[MSI SpeedSter-FA4][Pentium M 770@160*16][X800GTO2 LE][A-Data PC4300 2GB][Maxtor 300GB S-ATA 16MB][NEC ND-3520A IDE][Thermaltake Xaser Tsunami Svart Aluminium][Hiper Type R 480W] //Betty (Kung Pow) [Outdated]

Permalänk
Medlem

skrev en funktion du kan använda i din kodfil. anropa funktionen med AddXml(id, xmlText) där id = det nyinsatta id:et och xmlText är xml -texten. tex.

AddXml(3,"<info><id>3</id><name>namn</name><info2>7nåt</info2><info3>nåt</info3><include>0</include></info>");

jag har skrivit funktionen så att den sorterar efter id. lägsta id högst upp osv.
här är funktionskoden:

private void AddXml(int id, string xmlText) { bool nodeAdded = false; try { XmlDocument xd = new XmlDocument(); xd.Load(Server.MapPath("dinfil.xml")); XmlDocumentFragment docFrag = xd.CreateDocumentFragment(); docFrag.InnerXml = xmlText; XmlNodeList list = xd.DocumentElement.SelectNodes("info"); foreach (XmlNode node in list) { int currId = int.Parse(node.SelectSingleNode("id").InnerText); if (currId == id) { xd.DocumentElement.ReplaceChild(docFrag, node); nodeAdded = true; break; } else if (currId > id) { xd.DocumentElement.InsertBefore(docFrag, node); nodeAdded = true; break; } } if (!nodeAdded) xd.DocumentElement.AppendChild(docFrag); xd.Save(Server.MapPath("dinfil.xml")); } catch (Exception ex) { Response.Write(ex.ToString()); } }

hoppas den fungerar som du tänkt.

Permalänk

*svärord* great!
Funka *svärord* bättre än jag hoppades på!

Men denna perfekta lösning uppdaga ett lite värre problem, nämligen att data som inte defineras när man ska ersätta en redan befintlig post tas bort och lämnar ett blankt fält efter sig.

Jag tänkte då att man kanske kan göra så att om id:t finns, så returneras det som finns i hela elementet till dom text-boxar där man manuelt skriver in infon, så att man där ändrar och trycker på en ny, eller kanske samma knapp, för att ersätta med det man ändrat och med det som fanns tidigare om man inte ändrat nåt.

Går nåt sånt att genomföra?

Visa signatur

[MSI SpeedSter-FA4][Pentium M 770@160*16][X800GTO2 LE][A-Data PC4300 2GB][Maxtor 300GB S-ATA 16MB][NEC ND-3520A IDE][Thermaltake Xaser Tsunami Svart Aluminium][Hiper Type R 480W] //Betty (Kung Pow) [Outdated]