|
ok my code as changed..i googled for new code and i believe i found some that i can understand and is easy to apply.
The only problem is that is writing and reading only the first node.
How can i create new nodes and read only those that have the Date i want selected?
Please give me a hand here..this is not important as hell but i would like to be able to end my gadget... i believe i can do it with a few lines of code and is nothing really hard..but yes.. i am not understanding how to read and write more than one node...
here is my current code:
Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click
Dim folderPath As String = Directory.GetCurrentDirectory()
Dim filePath As String = Path.Combine(folderPath, "MEMOS\Database.xml")
Dim dat = TextBox1.Text
Dim plc = TextBox2.Text
Dim hed = TextBox3.Text
Dim mem = TextBox4.Text
Dim hor = ComboBox1.Text + " : " + ComboBox2.Text + " " + ComboBox3.Text
Dim writer As New XmlTextWriter(filePath, System.Text.Encoding.UTF8)
writer.WriteStartDocument(True)
writer.Formatting = Formatting.Indented
writer.Indentation = 2
writer.WriteStartElement("MEMOSAVE")
createNode(dat, hor, plc, hed, mem, writer)
writer.WriteEndElement()
writer.WriteEndDocument()
writer.Close()
End Sub
Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
Dim folderPath As String = Directory.GetCurrentDirectory()
Dim filePath As String = Path.Combine(folderPath, "MEMOS\Database.xml")
If Not File.Exists(filePath) Then
MessageBox.Show("DataBase not found!")
Else
Dim sav = TextBox1.Text
Dim xmlFile As XmlReader
xmlFile = XmlReader.Create(filePath, New XmlReaderSettings())
Dim ds As New DataSet
Dim dv As DataView
ds.ReadXml(xmlFile)
dv = New DataView(ds.Tables(0))
dv.Sort = "Date"
Dim index As Integer = dv.Find(sav)
If index = -1 Then
MsgBox("Item Not Found")
Else
Label9.Text = (dv(index)("Date").ToString())
Label10.Text = (dv(index)("Hour").ToString())
Label11.Text = (dv(index)("Place").ToString())
Label12.Text = (dv(index)("Header").ToString())
TextBox4.Text = (dv(index)("MEMO").ToString())
End If
Return
End If
End Sub
Thank you!
modified 7-Jan-19 21:02pm.
|
|
|
|
|
Alienoiz wrote: The only problem is that is writing and reading only the first node. I only see one call to the "createNode" method. What happens if you call that method twice?
="1.0"="utf-8"="yes"
<MEMOSAVE>
<15/12/2016>
<Date>15/12/2016</Date>
<Hour>01 : 05 PM</Hour>
<Place>USA</Place>
<Header>Testing Memo</Header>
<MEMO>Memorando test text!</MEMO>
</15/12/2016>
</MEMOSAVE> Your fragment has an element with the name 15/12/2016, but element-names (the things between the < and >) aren't allowed to have slashes in them. You could name it "entry" though. You already have the date in the properties following that, so it would also be a bit redundant to specify it twice.
Alienoiz wrote: i believe i can do it with a few lines of code and is nothing really hard..but yes.. You may need a bit more to handle multiple memo's.
I'd recommend creating a POCO, put those entries in a list, and XmlSerialize that. It looks more readable, and is easier to play with.
Imports System.IO
Imports System.Xml.Serialization
Public Class MyMemoEntry
Public CreatedOn As DateTime
Public Location As String
Public Header As String
Public Memo As String
End Class
Public Class Form1
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim Entries As New List(Of MyMemoEntry)
Dim newEntry As New MyMemoEntry
newEntry.CreatedOn = DateTime.Now
newEntry.Location = "Home, sweet home"
newEntry.Header = "How to build a decent chicken-soup"
newEntry.Memo = "Call Mom and say you want chicken-soup"
Entries.Add(newEntry)
Dim serializer As New XmlSerializer(Entries.GetType(), "space")
Using FileStream As New FileStream("output.xml", FileMode.Create)
serializer.Serialize(FileStream, Entries)
End Using
End Sub
End Class Which results in a file similar to below;
="1.0"
<ArrayOfMyMemoEntry xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="space">
<MyMemoEntry>
<CreatedOn>2016-12-14T17:59:55.9937761+01:00</CreatedOn>
<Location>Home, sweet home</Location>
<Header>How to build a decent chicken-soup</Header>
<Memo>Call Mom and say you want chicken-soup</Memo>
</MyMemoEntry>
</ArrayOfMyMemoEntry> That should be somewhat easier than writing the XML using a writer directly.
Also note that above saves a list of entries, not just one entry. You can fetch the CreatedOn property and get either the Date-part, the Time-part or both parts. Aw, and you don't have to use the "xml" file-extension when writing to a file, as long as you're using the right format.
Another nice thing about the above is that it is quite easy to replace the XmlSerializer with a JsonSerializer or the BinarySerializer. That way you are not limited or bound to XML.
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
|
|
|
|
|
ok.. thanks.. i am going to explore this as i am.. i hope i can get this done : )
Thanks again!
modified 7-Jan-19 21:02pm.
|
|
|
|
|
something is wrong.. i am not still being able to create various "myMemoEntry" nodes.. i would like to support each dataset in different nodes and access it by "Date"...
i would like to write something like this:
="1.0"
<ArrayOfMyMemoEntry xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="space">
<MyMemoEntry>
<CreatedOn>2016-12-14T17:59:55.9937761+01:00</CreatedOn>
<Location>Home, sweet home</Location>
<Header>How to build a decent chicken-soup</Header>
<Memo>Call Mom and say you want chicken-soup</Memo>
</MyMemoEntry>
<MyMemoEntry1>
<CreatedOn>2016-12-14T17:59:55.9937761+01:00</CreatedOn>
<Location>Home</Location>
<Header>chicken-soup</Header>
<Memo>Call Mom</Memo>
</MyMemoEntry1>
</ArrayOfMyMemoEntry>
: ) .. and then when i read, get all data inside the entry that has for eg: "2016-12-14"
:s
modified 7-Jan-19 21:02pm.
|
|
|
|
|
That's not a valid* XML format; forget about how you want it to look, the format is simply there to provide structure to load and save from.
Dim newEntry As New MyMemoEntry
newEntry.CreatedOn = DateTime.Now
newEntry.Location = "Home, sweet home"
newEntry.Header = "How to build a decent chicken-soup"
newEntry.Memo = "Call Mom and say you want chicken-soup"
Dim notherEntry As New MyMemoEntry
notherEntry.CreatedOn = DateTime.Now
notherEntry.Location = "Home, sweet home"
notherEntry.Header = "How to build a decent noodle-soup"
notherEntry.Memo = "Call Mom and say you want noodle-soup"
Dim testEntry As New MyMemoEntry
testEntry.CreatedOn = DateTime.Now.AddDays(-2)
testEntry.Location = "The restaurant at the end of the Universe"
testEntry.Header = "Eat more soup"
testEntry.Memo = "I forgot the reason"
Entries.Add(newEntry)
Entries.Add(notherEntry)
Entries.Add(testEntry)
Gives you valid XML like below;
="1.0"
<ArrayOfMyMemoEntry xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="space">
<MyMemoEntry>
<CreatedOn>2016-12-14T18:54:25.0337545+01:00</CreatedOn>
<Location>Home, sweet home</Location>
<Header>How to build a decent chicken-soup</Header>
<Memo>Call Mom and say you want chicken-soup</Memo>
</MyMemoEntry>
<MyMemoEntry>
<CreatedOn>2016-12-14T18:54:25.0337545+01:00</CreatedOn>
<Location>Home, sweet home</Location>
<Header>How to build a decent noodle-soup</Header>
<Memo>Call Mom and say you want noodle-soup</Memo>
</MyMemoEntry>
<MyMemoEntry>
<CreatedOn>2016-12-12T18:54:25.0337545+01:00</CreatedOn>
<Location>The restaurant at the end of the Universe</Location>
<Header>Eat more soup</Header>
<Memo>I forgot the reason</Memo>
</MyMemoEntry>
</ArrayOfMyMemoEntry> ..accessing the items in a list by date would not be hard either this way;
For Each item As MyMemoEntry In Entries _
.Where(Function(ent As MyMemoEntry) As Boolean
Return ent.CreatedOn.Date = DateTime.Today
End Function)
MessageBox.Show(item.Header)
Next
You can filter on any of the other fields in a similar way.
--edit
It is valid to confuse stuff more, as any XML-validator will tell you. It would also be abusing the format, as items representing the same thing are supposed to have the same element-name.
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
|
|
|
|
|
ok thats very good.. i understand it...thank you..i just do not know (again) how to create the variables for MyMemoEntry!!
i mean .. you are using code to set new entries but i would like to make that based on a button click.
for eg. i click on the button and it creates:
Dim newEntry As New MyMemoEntry
newEntry.CreatedOn = DateTime.Now
newEntry.Location = "Home, sweet home"
newEntry.Header = "How to build a decent chicken-soup"
newEntry.Memo = "Call Mom and say you want chicken-soup"
then i choose some new data to enter in the memo and when i click the button again it creates:
Dim notherEntry As New MyMemoEntry
notherEntry.CreatedOn = DateTime.Now
notherEntry.Location = "Home, sweet home"
notherEntry.Header = "How to build a decent noodle-soup"
notherEntry.Memo = "Call Mom and say you want noodle-soup"
then i choose new data, click in the save button and it creates:
Dim testEntry As New MyMemoEntry
testEntry.CreatedOn = DateTime.Now.AddDays(-2)
testEntry.Location = "The restaurant at the end of the Universe"
testEntry.Header = "Eat more soup"
testEntry.Memo = "I forgot the reason"
and so on : ) ...
modified 7-Jan-19 21:02pm.
|
|
|
|
|
If the property is a string, then you can assign the contents of a textbox to it. Like below;
testEntry.Header = textBoxHeader.Text
testEntry.Memo = textBox163.Text For the DateTime, I'd recommend a picker, not a textbox.
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
|
|
|
|
|
i have it like that..but it is not creating new entries, everytime i insert new data in the textboxes it only overwrites previous data in the .xml
: \
modified 7-Jan-19 21:02pm.
|
|
|
|
|
i believe i need this as variable:
Dim testEntry As New MyMemoEntry
i mean.. use a textbox to replace the "testEntry" with a name at my choice and then create it as new entry : )
modified 7-Jan-19 21:02pm.
|
|
|
|
|
|
well its funny.. i am not able to do it for what i think they are 3 or 4 lines of code..or even less..
i just need to find out how to create multiple entries with the same button!!!
the code is almost ready..i can write (only one entry cause when i try the second it overwrites the previous data)..i can read based in the "Date" field and i can also delete my file...
: )
modified 7-Jan-19 21:02pm.
|
|
|
|
|
If you are not using that list to hold "all" entries, then yes, you would need to find a way to see if the entry is already in the file, and if not, append it.
The approach of the list fixes both the invalid names in the XML-file as well as having to see if an entry is in the file, since it is easier to see if your entry is already in the list.
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
|
|
|
|
|
Ok yes... that´s what i need but i do not know how to code it!!!???
i want to append more entries so i can have different dates and memos and access them individually!
Yes i believe thats what i need to know : )
I manually inserted more entries and the reading seems ok..i am being able to read sorting from the "DATE" field..and it sorts all fields from that entry...so i believe the reading part is ok..the writting part it is not like we know..and i am trying to figure out how to remove my entries...i am being able to do it but it bugs a bit with the reading part cause when the file has all entries deleted the read part is returnning error because the procedure does not finds a valid table!!!
modified 7-Jan-19 21:02pm.
|
|
|
|
|
Alienoiz wrote: i am trying to figure out how to remove my entries.. You have the code to "Add" an item to a list(Of T), I'll leave it up to you to figure out how to Remove[^] an item of a List(Of T).
After modifying the list, call your Save-method so that the serializer overwrites the old file with the new contents of the list.
Alienoiz wrote: because the procedure does not finds a valid table!!! An XML file does not have the concept of a table; it's elements within elements. Show us some code
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
|
|
|
|
|
ok... this is what i am using to read:
Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
Dim folderPath As String = Directory.GetCurrentDirectory()
Dim filePath As String = Path.Combine(folderPath, "MEMOS\Database.xml")
If Not File.Exists(filePath) Then
MessageBox.Show("DataBase not found!")
Else
Dim sav = TextBox1.Text
Dim xmlFile As XmlReader
xmlFile = XmlReader.Create(filePath, New XmlReaderSettings())
Dim ds As New DataSet
Dim dv As DataView
ds.ReadXml(xmlFile)
dv = New DataView(ds.Tables(0))
dv.Sort = "Date"
Dim index As Integer = dv.Find(sav)
If index = -1 Then
MsgBox("Item Not Found")
Else
Label9.Text = (dv(index)("Date").ToString())
Label10.Text = (dv(index)("Hour").ToString())
Label11.Text = (dv(index)("Place").ToString())
Label12.Text = (dv(index)("Header").ToString())
TextBox4.Text = (dv(index)("MEMO").ToString())
End If
Return
End If
End Sub
it is working like a glove...it only has 1 catch..when there are no nodes in the .xml document or columns it returns:
"Cannot find table 0"
or
"Cannot find DATE column"
i am also not knowing how to close this proccess... so i can delete the file .xml..sometimes returns that the file is already in use when i try to delete it or record new data on it : (
but the rest seems ok : ) ...
modified 7-Jan-19 21:02pm.
|
|
|
|
|
Alienoiz wrote: "Cannot find table 0" If you load a dataset (a collection of tables) from XML, then these tables have to exist in the XML file.
Alienoiz wrote: i am also not knowing how to close this proccess... so i can delete the file .xml..sometimes returns that the file is already in use when i try to delete it or record new data on it : ( If you are done using the XmlReader[^], dispose it. Otherwise the reader will remain open and lock the file.
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
|
|
|
|
|
ok.. but is there a condition that i can use so that when it finds no table it "do nothing" for eg.
and can you show me how to dispose the XMLReader considering the code i have..i am finding too many info in one page that my mind cannot proccess :s
modified 7-Jan-19 21:02pm.
|
|
|
|
|
Alienoiz wrote: ok.. but is there a condition that i can use so that when it finds no table it "do nothing" for eg. You are now using "ds.Tables(0)", without checking if there is a table at that index.
And yes, that would probably be too cryptic if you don't understand what the code is doing.
Alienoiz wrote: and can you show me how to dispose the XMLReader considering the code i have. xmlFile.Dispose()
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
|
|
|
|
|
ok..so how can i check if there is a table for this case?
Thanks!
modified 7-Jan-19 21:02pm.
|
|
|
|
|
I believe that my code is almost ready..i just need to fix the table thing and it seems that the xmlfile.Dispose() it is only working when the code is inside a button click instance!
I was trying to use the MonthCalendar data change so that when i select a date in it, it automatically shows the Memo for that date...it works but then it conflicts again with the saving!
modified 7-Jan-19 21:02pm.
|
|
|
|
|
Alienoiz wrote: i just need to fix the table thing You may need a bit more, but yes, you should check the length of the array before using it.
Alienoiz wrote: it seems that the xmlfile.Dispose() it is only working when the code is inside a button click instance! Only works when the variable is in scope.
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
|
|
|
|
|
ok..can you show me the code to fix both things? or at least the table thing!!???
I am not able to fix it by myself!!!
modified 7-Jan-19 21:02pm.
|
|
|
|
|
Alienoiz wrote: ok..can you show me the code to fix both things I could, but then I'd be fixing the next issues also. I'll gladly help, but you seriously need to learn some of the basics before attempting projects.
MessageBox.Show(ds.Tables.Count)
That would show you how many tables are in the dataset. You need to do "nothing" if there are 0 tables there. So, something along the lines of "Ff (ds.Tables.Count = 0) Then"..
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
|
|
|
|
|
ok..i guess i solved the table problem..just do not know how to close the xmlfile.reader so it allows me to save at will!
modified 7-Jan-19 21:02pm.
|
|
|
|
|
Alienoiz wrote: just do not know how to close the xmlfile.reader so it allows me to save at will! If you create a reader (or a writer) object, then it needs to be disposed - in the same method where you are creating it.
The simpeler option is to wrap the reader in a using statement.
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
|
|
|
|