Получить XML дочерний узел и установить новое значение идентификатора - PullRequest
1 голос
/ 03 марта 2020

У меня есть документ XML, который я ищу, чтобы найти дочерние элементы <isolationStep> и <isolationProcedureEnd> для <isolationMainProcedure>. Я хочу установить id = (увеличенное число) для детей. Инкремент должен быть последовательным, и, если дочерний элемент является шагом, перед инкрементным значением перед ним стоит буква «S», для другого дочернего элемента - «E», так что id_S изоляция = «s1», изоляция ProcedureEnd = «e2», ИД изоляцияStep = = « s3 ', изоляцияStep ID =' s4 '. Мне трудно получить и установить значения дочерних узлов. Ваша помощь приветствуется.

xml образец

<content>
<faultIsolation>
  <faultIsolationProcedure applicRefId="test" id="-1">
        <isolationStep id="i1-001">
          <isolationStepQuestion></isolationStepQuestion>
          <isolationStepAnswer>
            <yesNoAnswer>
              <yesAnswer nextActionRefId="s1-003" />
              <noAnswer nextActionRefId="e1-002" />
            </yesNoAnswer>
          </isolationStepAnswer>
        </isolationStep>
        <isolationProcedureEnd id="e1-002">
        </isolationProcedureEnd>
        <isolationStep id="i1-001a">
        </isolationStep>
        <isolationProcedureEnd id="e1-007">
        </isolationProcedureEnd>
    </faultIsolationProcedure>
   </faultIsolation>
</content>

xml по примеру

<content>
<faultIsolation>
  <faultIsolationProcedure applicRefId="Software_TCTO_609_701_718_739_POST" id="-1">
        <isolationStep id="FI1s-1">
          <isolationStepQuestion>Do this first</isolationStepQuestion>
          <isolationStepAnswer>
            <yesNoAnswer>
              <yesAnswer nextActionRefId="FI1s-3" />
              <noAnswer nextActionRefId="FI1e-5" />
            </yesNoAnswer>
          </isolationStepAnswer>
        </isolationStep>
        <isolationProcedureEnd id="FI1e-2">
        </isolationProcedureEnd>
        <isolationStep id="FI1s-3">
          <isolationStepQuestion>Do this first</isolationStepQuestion>
        </isolationStep>
        <isolationStep id="FI1s-4">
          <isolationStepQuestion>Do this first</isolationStepQuestion>
        </isolationStep>
        <isolationProcedureEnd id="FI1e-5">
        </isolationProcedureEnd>
    </faultIsolationProcedure>
 </faultIsolation>
</content>   

Код

    Dim index As Integer = 1
    For Each node As XmlElement In renumNodes.SelectNodes("isolationProcedure/isolationMainProcedure")
        If node.Name = "isolationStep" Then
            MsgBox("Found step")
            For Each Attribute As XmlAttribute In node.Attributes
                Dim existID = node.GetAttribute("id")
                modExistID = "FI" + Count.ToString + "S-" + index.ToString
                dictionaryNewID.Add(existID, modExistID)
                node.SetAttribute("id", modExistID)
                index += 1
            Next
        ElseIf node.Name = "isolationProcedureEnd" Then
            For Each Attribute As XmlAttribute In node.Attributes
                Dim existID = node.GetAttribute("id")
                modExistID = "FI" + Count.ToString + "E-" + index.ToString
                dictionaryNewID.Add(existID, modExistID)
                node.SetAttribute("id", modExistID)
                index += 1
            Next
        End If
    Next

Ответы [ 2 ]

1 голос
/ 04 марта 2020

Попробуйте xml linq ниже:

Imports System.Xml
Imports System.Xml.Linq
Module Module1
    Const INPUT_FILENAME As String = "c:\temp\test.xml"
    Const OUTPUT_FILENAME As String = "c:\temp\tes1.xml"
    Sub Main()
        Dim refId As String = "Software_TCTO_609_701_718_739_POST"
        Dim doc As XDocument = XDocument.Load(INPUT_FILENAME)

        Dim faultIsolationProcedure As XElement = doc.Descendants("faultIsolationProcedure").FirstOrDefault()
        faultIsolationProcedure.SetAttributeValue("applicRefId", refId)

        Dim children As List(Of XElement) = faultIsolationProcedure.Elements().ToList()

        For i As Integer = 1 To children.Count
            Dim child As XElement = children(i - 1)
            If (child.Name.LocalName.EndsWith("Step")) Then
                child.SetAttributeValue("id", "FI1s-" + i.ToString())
            Else
                child.SetAttributeValue("id", "FI1e-" + i.ToString())
            End If
        Next i
        For i As Integer = 1 To children.Count
            Dim child As XElement = children(i - 1)
            If child.Name.LocalName.EndsWith("Step") Then
                Dim yesAnswer = child.Descendants("yesAnswer").FirstOrDefault()
                If Not yesAnswer Is Nothing Then
                    'get next step
                    Dim j = i + 1
                    While (j <= children.Count())
                        If children(j - 1).Name.LocalName.EndsWith("Step") Then
                            Exit While
                        End If
                        j = j + 1
                    End While
                    If j <= children.Count() Then
                        Dim id As String = children(j - 1).Attribute("id")
                        yesAnswer.SetAttributeValue("nextActionRefId", id)
                    Else
                        yesAnswer.SetAttributeValue("nextActionRefId", "ERROR")
                    End If

                    'get 2nd End
                    Dim noAnswer = child.Descendants("noAnswer").FirstOrDefault()
                    'get 2nd end
                    j = i + 1
                    Dim endCount = 0
                    While (j <= children.Count())
                        If children(j - 1).Name.LocalName.EndsWith("End") Then
                            If endCount = 1 Then
                                Exit While
                            End If
                            endCount = endCount + 1
                        End If
                        j = j + 1
                    End While
                    If j <= children.Count() Then
                        Dim id As String = children(j - 1).Attribute("id")
                        noAnswer.SetAttributeValue("nextActionRefId", id)
                    Else
                        noAnswer.SetAttributeValue("nextActionRefId", "ERROR")
                    End If
                End If
            End If
        Next i

        doc.Save(OUTPUT_FILENAME)
    End Sub

End Module
0 голосов
/ 04 марта 2020

Я смог добиться нумерации дочерних узлов таким образом.

Код

   ' For Each fi In renumNodes
    Dim fiCount = 1
    Dim xmldocNode As XmlNodeList
    xmldocNode = xmldoc.SelectNodes("descendant::isolationMainProcedure")
    Dim stepIndex = 1
    Dim value As Object = Nothing
    Dim Field As XmlNode
    For Each Field In xmldocNode(0).SelectNodes("isolationStep|isolationProcedureEnd")
        Dim stepLeadingZeror = stepIndex.ToString("D4")
        If Field.Name = "isolationStep" Then
            For Each Attribute As XmlAttribute In Field.Attributes
                If Attribute.Name = "id" Then
                    existingStep = Field.Attributes(0).Value
                    modExistID = "f" + fiCount.ToString + "s-" + stepLeadingZeror
                    Field.Attributes(0).Value = modExistID
                End If
                dictionaryRenumberID.Add(existingStep, modExistID)
                Dim newID = Field.Attributes
            Next
        ElseIf Field.Name = "isolationProcedureEnd" Then
            For Each Attribute As XmlAttribute In Field.Attributes
                If Attribute.Name = "id" Then
                    Dim existingStepEnd = Attribute.Value
                    Attribute.Value = "id" + stepIndex.ToString
                    modExistEndID = "f" + fiCount.ToString + "e-" + stepLeadingZeror
                    Field.Attributes(0).Value = modExistEndID
                    dictionaryRenumberID.Add(existingStepEnd, modExistEndID)
                End If
            Next
        End If
        stepIndex = stepIndex + 1
        fiCount = fiCount + 1
    Next
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...