webForumDet fria alternativet

Editera XML från ASP.NET?

.NETur .NET

8 svar · 432 visningar · startad av CokeLight

CokeLightMedlem sedan juni 2000504 inlägg
#1

Hejsan,

Hur gör man för att editera en nod i XML
<namn>Olle</namn> och så vill jag att det ska stå <namn>Lisa</namn> t.ex? Och hur skickar man parameter till XML filen? (t.ex. text via en text ruta och en submit knapp).

Det finns gott om länkar på hur man läser in från XML (med xmlreader) och skapar xml med xmltextwriter.. men jag har hittar inget enkelt exempel om att editera.. nån som vet nån bra länk eller har lite kod eller nåt? :)

Alltså, det jag skulle vilja åstadkomma är nåt i stil med SQL updates.. "update tblCustomer set cName = 'Lisa' where cDate = '2004-03-07' typ nåt sånt, fast jag har en XML fil som databas istället..??

renholmMedlem sedan apr. 20012 266 inlägg
#2

Finns väl ett antal sätt att göra det på, har själv inte så ofta arbetat med xmlfiler, brukar endast läsa från dem. Kika här: http://samples.gotdotnet.com/quickstart/howto/doc/xml/overviewofxml.aspx

Det jag vet fungerar är XmlSerialization vilket är en teknik där en klass speglas i en xml-fil ungefär, läs mer här: http://samples.gotdotnet.com/quickstart/howto/doc/xmlserialization/XSDFromCls.aspx

NöffMedlem sedan nov. 2003569 inlägg
#3

Men det absolut bästa sättet måste ju vara att ösa in XML datat i ett editerbart datagrid

DataSet dataset=new DataSet();
mydataset.ReadXml("C:\\Inetpub\\wwwroot\\ass.xml");
DataGrid1.DataSource=dataset.Tables[3];
DataGrid1.DataBind();

Uppdatera dataset:et

dataset.Tables[3].Rows[e.Item.ItemIndex]["namn"]=((TextBox)e.Item.Cells[3].Controls[0]).Text;

Och när du är klar.

mydataset.WriteXml("C:\\Inetpub\\wwwroot\\ass.xml");

lätt som en plätt.

CokeLightMedlem sedan juni 2000504 inlägg
#4

tack renholm och Nöff för era inlägg.. ! Jo, precis, från de länkarna så verkar det hittils som om XmlDocument är det bästa för att editera xml:n direkt.. finns säkert andra sätt också.. Man skapar en XmlNode och sen mha InnerText kan man ändra värdet på aktuell nod.. Vill man lista eller förändra flera noder samtidigt kan man använda XmlNodeList osv..

hmm.. jaså.. hur då.. man lägger in xml:n i ett dataset.. som man sedan kan manipulera programatiskt..? intressant.. jag stötte på konceptet när jag sökte på internet men trodde inte att det var tillämpbart på mitt problem så jag läste aldrig närmare.. men ska kolla mer på det.. får fråga dig imorn annars kanske.. :) tack för hjälpen

kristofferMedlem sedan juni 20001 257 inlägg
NöffMedlem sedan nov. 2003569 inlägg
#6

jao, ska du pyssla med xml så är dataset:s och datagrid:s att föredra.

du kan också, om du vill skicka hela dataset:et genom en webservice utan problem, låt bara webmetoden returnera dataset:et.

eller, du kanske också rita ut xml datat direkt på en websida genom att använda metoden GetXml() på dataset:et, ifall du vill att flera servrar ska få tillgång till den rakt av utan att använda någon webservice, då kan dom tex göra såhär: dataset.ReadXml("http://www.dinwebplats.com/ass.aspx");
så har dom fått ner hela din xml fil till sitt eget dataset. dödligt smidigt :), windowsklienter kan göra samma sak för att få hem xmldatat.

eller du kan också fylla dit dataset med grejer från en databas och spara ner det som en Xml fil utan tjafs med WriteXml så konverterar dataset:et alltihopa till xml, och så kan du använda GetXml för att rita ut det på en websida så att andra kan hämta hem det.

wiii

CokeLightMedlem sedan juni 2000504 inlägg
#7

låter super ! tack för svaren.. har inte provat än.. Ska testa koden från länken som kristoffer skickade o se hur det funkar.. antar att det är samma dataset du menar nöff? antar att man via andra funktioner kan skicka in värden till datasetet? Alltså, så att datasetet också kan fungera som en "editeringsmotor" i bakgrunden utan att användaren aktivt måste mata in värden i datagriden utan att värdena bara processas där..? (om det nu gick förstå =) Jag ska prova iaf o återkomma sen med lite kod.. ni verkar ju ha koll.. :)

ska prova dataset så fort nedanstående funkar.. nån som vet?

System.NullReferenceException: Object reference not set to an instance of an object

public void editXML(String xmlDoc)
{
	XmlDocument objXmlDoc = new XmlDocument();
	objXmlDoc.Load(xmlDoc);

	XmlNode booking = objXmlDoc.DocumentElement;

	objNodes = objXmlDoc.GetElementsByTagName("bokning");

	foreach(XmlNode objNode in objNodes)
	{
		this.lblXmlContent.Text += "Date: " + objNode.Attributes["fromDatum"].InnerText + "<br>";
	}
}

och felet syftar på raden med "innertext. Är det nåt som inte är deklarerat eller..? Rootelement är Bokningar, sen kommer bokning, och sen fromDatum. Det jag vill göra är just nu bara att visa värdena från alla fromDatum som finns i XML filen.. om det funkar borde det ju bara vara samma sak att ge noden nya värden på samma sätt.. (tror jag).

ang. webservices, funderade lite på det du skrev om webservices.. alltså, är syftet att det andra (företaget) automatiskt ska kunna få in värden från min xml fil till sin egen (databas källa) utan ytterligare kodning? a låter coolt :)

DinoMedlem sedan sep. 20011 914 inlägg
#8

Om du vill skriva koden själv.

.aspx

<asp:repeater id="repEdit" runat="server">
   <headertemplate>
      <table>
   </headertemplate>
   <itemtemplate>
      <tr>
         <td><asp:textbox id="tbDate" runat="server" /></td>
      </tr>
   </itemtemplate>
   <footertemplate>
      </table>
   </footertemplate>
</asp:repeater>
<asp:button id="btEdit" text="Uppdatera" runat="server" />
.aspx.cs

public class EditXMLFile : System.Web.UI.Page
{
   protected Repeater repEdit;
   protected Button btEdit;

   private void Page_Load(object sender, System.EventArgs e)
   {
      if(!IsPostBack)
      {
         repEdit.DataSource = GetXml();
         repEdit.DataBind();
      }
   }

   private ArrayList GetXml()
   {
      ArrayList arr = new ArrayList();
      XmlTextReader xdr = new XmlTextReader(Server.MapPath("EditXMLFile.xml"));
      while(xdr.Read())
      {
         if(xdr.NodeType == XmlNodeType.Element)
         {
            if(xdr.Name == "Datum")       
            {    
                arr.Add(xdr.ReadString());
            }			
         }
      }
      xdr.Close();
      return arr;
   }

   private void btEdit_Click(object sender, System.EventArgs e)
   {
      UpdateXml(repEdit);
   }

   private void UpdateXml(Repeater rep)
   {
      XmlTextWriter w = new XmlTextWriter(Server.MapPath("EditXMLFile.xml"), System.Text.Encoding.UTF8);
      w.Formatting = Formatting.Indented;
      w.Indentation = 4;
      w.WriteStartDocument();
      w.WriteStartElement("Bokningar");
      foreach(RepeaterItem ri in rep.Items)
      {
         if(ri.ItemType == ListItemType.Item || ri.ItemType == ListItemType.AlternatingItem)
         {
            w.WriteStartElement("Bokning");
            w.WriteElementString("Datum", ((TextBox)ri.FindControl("tbDate")).Text);
            w.WriteEndElement();
         }
      }
      w.WriteEndElement();
      w.Close();
   }

   private void repEdit_ItemDataBound(object sender, RepeaterItemEventArgs e)
   {
      if(e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
      {
         ((TextBox)e.Item.FindControl("tbDate")).Text = (string)e.Item.DataItem;
      }
   }

   override protected void OnInit(EventArgs e)
   {
      InitializeComponent();
      base.OnInit(e);
   }

   private void InitializeComponent()
   {    
      this.Load += new System.EventHandler(this.Page_Load);
      this.repEdit.ItemDataBound += new RepeaterItemEventHandler(this.repEdit_ItemDataBound);
      this.btEdit.Click += new EventHandler(this.btEdit_Click);
   }
}
.xml

<?xml version="1.0" encoding="utf-8"?>
<Bokningar>
    <Bokning>
        <Datum>2003-01-23</Datum>
    </Bokning>
    <Bokning>
        <Datum>2003-02-12</Datum>
    </Bokning>
    <Bokning>
        <Datum>2003-05-13</Datum>
    </Bokning>
    <Bokning>
        <Datum>2003-05-22</Datum>
    </Bokning>
    <Bokning>
        <Datum>2003-06-30</Datum>
    </Bokning>
    <Bokning>
        <Datum>2012-11-30</Datum>
    </Bokning>
</Bokningar>
CokeLightMedlem sedan juni 2000504 inlägg
#9

oj oj.. blev chockad.. gigantiskt tack Dino :) ska titta på detta på en gång..

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