XmlDocument проходит через слишком много раз - PullRequest
0 голосов
/ 04 марта 2020

У меня есть XML документ с несколькими обработками faultIsolationProcedures, которые мне нужны для увеличения идентификационных номеров. Код работает, КРОМЕ ТОГО, что он считает каждую faultIsolationProcedure 3 раза. Я пытался использовать различные выражения XPath и получаю странные 3 раза l oop.

Код:

Dim fiCount = 1
Dim renumNodes As XmlNode = xmldoc.SelectSingleNode("/dmodule/content/faultIsolation/faultIsolationProcedure")

For Each fi In renumNodes
    Dim origFiId = renumNodes.Attributes("id").Value
    Dim newFIID = "f" + fiCount.ToString
    renumNodes.Attributes(0).Value = modExistID
    dictionaryRenumberID.Add(origFiId, newFIID)

    fiCount = fiCount + 1
Next

Пример 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>

1 Ответ

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

Использование XElement, которое я считаю проще. Сначала данные

Dim xe As XElement
' xe=XElement.Load("path here")
'for testing use a literal
xe = <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>
             <faultIsolationProcedure applicRefId="test" id="">
                 <isolationProcedureEnd id="e1-007">
                 </isolationProcedureEnd>
             </faultIsolationProcedure>
         </faultIsolation>
     </content>

Обратите внимание, что я добавил одну faultIsolationProcedure.

Затем, используя эти данные, можно увеличить идентификатор id следующим образом:

Dim ie As IEnumerable(Of XElement)

'get all faultIsolationProcedure
ie = From el In xe...<faultIsolationProcedure> Select el

'increment id
For Each f As XElement In ie
    Dim idv As Integer = 0
    If Integer.TryParse(f.@id, idv) Then
        f.@id = (idv + 1).ToString
    Else
        Dim att As XAttribute = f.Attribute("id")
        If att IsNot Nothing Then
            f.@id = "1"
        End If
    End If
Next
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...