尝试用原始值和新值替换XML元素

  • 本文关键字:新值 替换 XML 元素 原始 xml vb.net
  • 更新时间 :
  • 英文 :


我有以下Sub,其目标是根据需要更新或添加XML树。当我阅读代码时,看起来代码应该按照需要替换现有的节点。但是,代码保留了原来的值,并添加了新的值。我已经检查了检查器,逻辑正在做它应该做的事情:

Private Sub UpdateAllPlayerXML(strMemberID As String, strMemberName As String, strPlayerFirstName As String, strPlayerLastName As String)
' Open the XML AllPlayers.xml file
Dim xdoc As New XDocument
xdoc = XDocument.Load(Application.StartupPath + "AllPlayers.xml")
Dim target As XElement = xdoc.Descendants("Player").FirstOrDefault(Function(x) x.Element("MembershipNo").Value = strMemberID)
If strMemberID <> "GUEST99999" And Not String.IsNullOrWhiteSpace(strMemberID) Then
If IsNothing(target) Then
' This should mean we have a NEW element.
Dim newPlayer As XElement = New XElement("Player")
newPlayer.Add(New XElement("FirstName", strPlayerFirstName))
newPlayer.Add(New XElement("LastName", strPlayerLastName))
newPlayer.Add(New XElement("MembershipNo", strMemberID))
newPlayer.Add(New XElement("MembershipName", strMemberName))
xdoc.Element("PlayerList").Add(newPlayer)
Else
' This should mean we are UPDATING an element.
' If the incoming name is blank but the existing name is not, DO NOT UPDATE
target.SetElementValue("FirstName", strPlayerFirstName)
target.SetElementValue("LastName", strPlayerLastName)
target.SetElementValue("MembershipNo", strMemberID)
target.SetElementValue("MembershipName", strMemberName)
End If
xdoc.Save(Application.StartupPath + "AllPlayers.xml")
' Since a new team was made, we should update the "Global Player List" on the form.
LoadPlayersListFromXML()
lbSearchResults.ClearSelected()
End If
End Sub

查找生成的XML文件,我看到它添加了一个新元素,而保留了原始元素。


EDIT: As requested:

  • 原文:https://pastebin.com/rS3fiakU
  • 的"修改":https://pastebin.com/H3Dp6DHg您将看到,我试图将0000000446的MembershipNo条目更改为"Test user"。

我用您提供的代码和xml文件对它进行了测试。I update successfully.

我的环境是。net 4.8, Visual Studio 2019。

下面的代码是您测试的源代码。

Dim xdoc As New System.Xml.Linq.XDocument
xdoc = System.Xml.Linq.XDocument.Load("AllPlayers.xml")
Dim strMemberID As String = "0000000446"
Dim strPlayerFirstName As String = ""
Dim strPlayerLastName As String = ""
Dim strMemberName As String = "Test"
Dim target As XElement = xdoc.Descendants("Player").FirstOrDefault(Function(x) x.Element("MembershipNo").Value = strMemberID)
If strMemberID <> "GUEST99999" And Not String.IsNullOrWhiteSpace(strMemberID) Then
If IsNothing(target) Then
' This should mean we have a NEW element.
Dim newPlayer As XElement = New XElement("Player")
newPlayer.Add(New XElement("FirstName", strPlayerFirstName))
newPlayer.Add(New XElement("LastName", strPlayerLastName))
newPlayer.Add(New XElement("MembershipNo", strMemberID))
newPlayer.Add(New XElement("MembershipName", strMemberName))
xdoc.Element("PlayerList").Add(newPlayer)
Else
' This should mean we are UPDATING an element.
' If the incoming name is blank but the existing name is not, DO NOT UPDATE
target.SetElementValue("FirstName", strPlayerFirstName)
target.SetElementValue("LastName", strPlayerLastName)
target.SetElementValue("MembershipNo", strMemberID)
target.SetElementValue("MembershipName", strMemberName)
End If
xdoc.Save("AllPlayers.xml")

如果你找到解决办法,也请让我知道。

最新更新