Вот пример, который позволяет пользователю решить, как вернуть дату, когда день больше числа дней в месяце.
def add_months(date, months, endOfMonthBehaviour='RoundUp'):
assert endOfMonthBehaviour in ['RoundDown', 'RoundIn', 'RoundOut', 'RoundUp'], \
'Unknown end of month behaviour'
year = date.year + (date.month + months - 1) / 12
month = (date.month + months - 1) % 12 + 1
day = date.day
last = monthrange(year, month)[1]
if day > last:
if endOfMonthBehaviour == 'RoundDown' or \
endOfMonthBehaviour == 'RoundOut' and months < 0 or \
endOfMonthBehaviour == 'RoundIn' and months > 0:
day = last
elif endOfMonthBehaviour == 'RoundUp' or \
endOfMonthBehaviour == 'RoundOut' and months > 0 or \
endOfMonthBehaviour == 'RoundIn' and months < 0:
# we don't need to worry about incrementing the year
# because there will never be a day in December > 31
month += 1
day = 1
return datetime.date(year, month, day)
>>> from calendar import monthrange
>>> import datetime
>>> add_months(datetime.datetime(2016, 1, 31), 1)
datetime.date(2016, 3, 1)
>>> add_months(datetime.datetime(2016, 1, 31), -2)
datetime.date(2015, 12, 1)
>>> add_months(datetime.datetime(2016, 1, 31), -2, 'RoundDown')
datetime.date(2015, 11, 30)
Я лично предпочитаю использовать класс XDocument, который был реализован в .Net 3.5.
Учитывая, что:
Я кодировал что-то вроде этого чтобы удалить только строку, которую я выбираю с помощью строки «deleteme», которая может быть вашим «TextBox1.Text».
Как я уже писал, он будет удалять все, содержащие данную строку. Если вы уверены, что у вас есть только одна запись с данной строкой, вы можете ввести команду «Выход для», как вы это делали в своем примере.
Dim tst_xml_path = "MyPath"
Dim deleteme As String = ("0145191647505")
Dim doc As New XDocument()
doc = XDocument.Load(tst_xml_path & "tst.xml")
For Each elem In doc.<sales_audit_xml>.<DataTable>
If elem.<TicketNumber>.Value = deleteme Then
MsgBox("Element " & elem.<TicketNumber>.Value & " deleted!")
elem.<TicketNumber>.Remove()
End If
Next
Console.WriteLine(doc.ToString)
doc.Save(tst_xml_path & "tst.xml")
Итак, я попробовал ваш полный код со следующими правками:
Public Sub Button5_Click() 'Removed the params to call the function easily.
Dim deleteme As String = ("01451947504") 'Debug Var for string comapre
Dim doc As New XmlDocument()
doc.Load(path & FileXml)
Dim Nodes = doc.SelectNodes("//TicketNumber")
For Each elem As XmlElement In Nodes
If elem.InnerText = deleteme Then
elem.ParentNode.ParentNode.RemoveChild(elem.ParentNode)
MsgBox("Element Deleted! ", MsgBoxStyle.Critical) '& TicketNumber.ToString) 'Edited the MessageBox
End If
Next
doc.Save(path & "ouput.xml") 'Edited the ouput file for debug purpose
End Sub
Я просто называю его в своей основной функции следующим образом ...
Dim Tst = New Form1
Tst.Button5_Click()
И все прошло нормально. Я могу удалить все 3 таблицы данных, которые вы написали в своем примере XML-файла ...