Это node.Attributes("id").Value + 1
не будет работать, потому что вы не можете добавить число 1 в строку. Так как вы увеличиваете свой идентификатор? Из того, что я понял, вам нужно увеличить эти значения
- "step21"
- "step22"
- "step23"
- "step23a"
- "step23b"
- "step23 c"
- "step23c1"
- "step23c2"
- "step23c3"
Вы должны определить это. Напишите функцию, которая принимает строку и увеличивает ее в соответствии с вашими правилами. Если вы предоставите увеличенные значения, мы можем помочь с логи c, вероятно. Поэтому добавьте вашу новую функцию приращения
Public Function IncrementId(id As String) As String
Return id & "incremented"
End Function
и измените код для вызова новой функции приращения
node("proceduralStep").SetAttribute("id", IncrementId(node.Attributes("id").Value))
, и я думаю, что это должно сделать.
Однако я предпочитаю сериализацию Xml вместо XmlDocument по нескольким причинам. Основная причина в том, что вы можете моделировать свои данные с помощью NET классов, и вы получаете строгую типизацию! Например, System. Xml .XmlAttribute.Value всегда является строкой, но иногда данные в вашем файле Xml не являются. Однако в вашем случае это так.
Итак, вот что я хотел бы сделать. Добавьте эти классы, которые определяют вашу модель данных
<XmlRoot>
Public Class dmodule
<XmlElement("proceduralStep")>
Public Property proceduralSteps As List(Of proceduralStep)
End Class
Partial Public Class proceduralStep
<XmlElement("proceduralStep")>
Public Property proceduralSteps As List(Of proceduralStep)
<XmlAttribute>
Public Property id As String
<XmlElement>
Public Property para As para
End Class
Public Class para
<XmlText>
Public Property Description As String
<XmlElement>
Public Property internalRef As internalRef
End Class
Public Class internalRef
<XmlAttribute>
Public Property internalRefId As String
<XmlAttribute>
Public Property internalRefTargetType As String
End Class
. С их помощью вы можете десериализовать xml в строго типизированные. NET объекты в памяти, свойства которых можно повторять и модифицировать (вместо передачи строк). в doc.SelectNodes("/dmodule/proceduralStep")
)
Теперь вы можете десериализовать (файл >> память) и сериализовать (память >> файл).
Dim myDmodule As dmodule
Dim serializer As New XmlSerializer(GetType(dmodule))
' read to memory
Using sr As New StreamReader("C:\Test\34 XML Parsing\XML File\CascadingStepsExample.xml")
myDmodule = CType(serializer.Deserialize(sr), dmodule)
End Using
' write to file
Using sw As New StreamWriter("C:\Test\34 XML Parsing\XML File\CascadingStepsExample_inc.xml")
serializer.Serialize(sw, myDmodule)
End Using
Вы можете добавить некоторые функции для рекурсивного поиска всех атрибутов id и увеличиваем их
' increment function
Public Shared Function incrementId(id As String) As String
Return id & "incremented" ' how do you REALLY increment this?
End Function
' recursive id finder and incrementer method
Public Shared Sub incrementIds(steps As IEnumerable(Of proceduralStep))
For Each s In steps
If Not String.IsNullOrEmpty(s.id) Then
s.id = incrementId(s.id)
End If
incrementIds(s.proceduralSteps)
Next
End Sub
Просто вызовите функцию после десериализации вашей модели и сериализации обратно в файл.
Dim myDmodule As dmodule
Dim serializer As New XmlSerializer(GetType(dmodule))
Using sr As New StreamReader("C:\Test\34 XML Parsing\XML File\CascadingStepsExample.xml")
myDmodule = CType(serializer.Deserialize(sr), dmodule)
End Using
' increment recursively
incrementIds(myDmodule.proceduralSteps)
Using sw As New StreamWriter("C:\Test\34 XML Parsing\XML File\CascadingStepsExample_inc.xml")
serializer.Serialize(sw, myDmodule)
End Using
Тем не менее, нам не хватает логики приращения c так что вам нужно придумать это, и снова, мы можем помочь с этим.