добавить дочерний узел в родительский xml с определенным внутренним текстом vb.net

Я могу добавить новый дочерний CharacterDevelopmentID с инкрементным идентификатором в качестве внутреннего текста в Characterdevelpments — без проблем. Это заставляет меня:

  <S2SProject>
   <CharacterDevelopments>
    <CharacterDevelopmentID>1</CharacterDevelopmentID>
    <CharacterDevelopmentID>2</CharacterDevelopmentID>
  </CharacterDevelopments>
 </S2SProject>

После добавления CharacterDevelopmentID мне нужно добавить дополнительный дочерний CharacterDevelopmentName, но только к только что созданному CharacterDevelopmentID, поэтому новый XML должен выглядеть так:

<S2SProject>
 <CharacterDevelopments>
  <CharacterDevelopmentID>1
   <CharacterDevelopmentName>another test</CharacterDevelopmentName>
  </CharacterDevelopmentID>
  <CharacterDevelopmentID>2
   <CharacterDevelopmentName>yet another test</CharacterDevelopmentName>
  </CharacterDevelopmentID>
 </CharacterDevelopments>
</S2SProject>

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

        fullPath = TSProjectProjectLocation.Text & "\" & TSProjectProjectName.Text

        xmlDoc.Load(fullPath)
        Dim elemList As XmlNodeList = xmlDoc.GetElementsByTagName("CharacterDevelopmentID")
        Dim i As Integer = elemList.Count + 1

        newChild = CType(xmlDoc.CreateNode(Xml.XmlNodeType.Element, "CharacterDevelopment", ""), XmlElement)
        newChild.SetAttribute("CharacterDevelopmentID", i)
        childnode = xmlDoc.CreateElement("CharacterDevelopmentID", i)

        Dim elem1 As XmlElement
        elem1 = xmlDoc.CreateElement("CharacterDevelopmentID")
        elem1.InnerText = i
        parNode = xmlDoc.SelectSingleNode("/S2SProject/CharacterDevelopments")
        parNode.AppendChild(elem1)
        xmlDoc.Save(fullPath) ' --- up to here it works!

        elem1 = xmlDoc.CreateElement("CharacterDevelopmentName")
        elem1.InnerText = NewCharacterDevelopmentName
        parNode = xmlDoc.SelectSingleNode("/S2SProject/CharacterDevelopments/CharacterDevelopmentID[last()]/]") '-- this gives an error XpathException
        parNode.AppendChild(elem1)
        xmlDoc.Save(fullPath)

Я пробовал несколько вещей, чтобы заставить программу выбрать правильный узел, но безрезультатно. Может кто-то указать мне верное направление? Все, что поможет мне понять это, будет высоко оценено!


person SvenLie    schedule 07.04.2021    source источник


Ответы (1)


Я собираюсь уйти с работы, но оставлю код, чтобы вы задумались.

    Dim xe As XElement
    ' for production use
    '  xe = XElement.Load("path here")
    'for testing use literal
    xe = <S2SProject>
             <CharacterDevelopments>
             </CharacterDevelopments>
         </S2SProject>

    'add some CharacterDevelopmentID
    For x As Integer = 1 To 9
        xe.<CharacterDevelopments>.FirstOrDefault.Add(<CharacterDevelopmentID><%= x %></CharacterDevelopmentID>)
    Next

    'select a particular CharacterDevelopmentID
    Dim sel As IEnumerable(Of XElement)
    sel = From el In xe.<CharacterDevelopments>.<CharacterDevelopmentID>
          Where el.FirstNode.ToString = "7"
           Select el Take 1

    If sel.Count = 1 Then
        sel(0).LastNode.AddAfterSelf(<CharacterDevelopmentName>another test</CharacterDevelopmentName>)
    End If
person dbasnett    schedule 07.04.2021