код удаляет только первый набор узлов XML, а не другие

Вот пример, который позволяет пользователю решить, как вернуть дату, когда день больше числа дней в месяце.

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)
0
задан 789 14 March 2019 в 09:59
поделиться

1 ответ

Я лично предпочитаю использовать класс XDocument, который был реализован в .Net 3.5.

Учитывая, что:

  • Ваша структура XML всегда одинакова
  • Вы используете .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-файла ...

0
ответ дан J.F. 14 March 2019 в 09:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: