Добавить атрибут id к первому дочернему элементу - PullRequest
0 голосов
/ 11 марта 2020

У меня есть документ XML, и мне нужно получить значение атрибута id, если он есть, если он не создан, а затем присвоить значение первому вхождению элемента. Я могу получить элемент Field и установить новый идентификатор, но в следующий раз, если атрибут id, который я только что установил, будет перезаписан. Как бы я указал для первого вхождения элемента назначить id = "i1", все другие дочерние элементы назначить id = "s1"?

XML Образец

    <isolationMainProcedure>
  <isolationStep id="i-001">
    <note>
      <notePara>xxx xx</notePara>
    </note>
    <action>xxx xx<acronym id="rcm">xxx xx<acronymTerm>xxx xx</acronymTerm>xxx xx<acronymDefinition>xxx xx</acronymDefinition>xxx xx</acronym>xxx xx</action>
    <isolationStepQuestion>xxx xx</isolationStepQuestion>
    <isolationStepAnswer>
      <yesNoAnswer>
        <yesAnswer nextActionRefId="e-001" />
        <noAnswer nextActionRefId="s-001" />
      </yesNoAnswer>
    </isolationStepAnswer>
  </isolationStep>
  <isolationProcedureEnd id="e-001">
    <action>xxx xx<acronymTerm internalRefId="rcm">xxx xx</acronymTerm>xxx xx</action>
    <action>xxx xx<dmRef>xxx xx<dmRefIdent>xxx xxxxx xx</dmRefIdent>xxx xx</dmRef>xxx xx</action>
  </isolationProcedureEnd>
  <isolationStep id="s-001">
    <action>xxx xx</action>
    <isolationStepQuestion>xxx xx</isolationStepQuestion>
    <isolationStepAnswer>
      <yesNoAnswer>
        <yesAnswer nextActionRefId="s-002" />
        <noAnswer nextActionRefId="e-002" />
      </yesNoAnswer>
    </isolationStepAnswer>
  </isolationStep>
  <isolationProcedureEnd id="e-002">
    <action>xxx xx<acronym id="gcs">xxx xx<acronymTerm>xxx xx</acronymTerm>xxx xx<acronymDefinition>xxx xx</acronymDefinition>xxx xx</acronym>xxx xx<acronym id="sbs">xxx xx<acronymTerm>xxx xx</acronymTerm>xxx xx<acronymDefinition>xxx xx</acronymDefinition>xxx xx</acronym>xxx xx<acronym id="ramts">xxx xx<acronymTerm>xxx xx</acronymTerm>xxx xx<acronymDefinition>xxx xx</acronymDefinition>xxx xx</acronym>xxx xx</action>
    <action>xxx xx<acronymTerm internalRefId="gcs">xxx xx</acronymTerm>xxx xx<acronymTerm internalRefId="sbs">xxx xx</acronymTerm>xxx xx<acronymTerm internalRefId="ramts">xxx xx</acronymTerm>xxx xx</action>
  </isolationProcedureEnd>
</isolationMainProcedure>

Код

        Dim stepLeadingZeror = stepIndex.ToString("D4")
        For Each Field As XmlElement In xmldocNode.SelectNodes("isolationStep|isolationProcedureEnd")
            If (Field.HasAttribute("id")) Then
                Dim initExistingStep As String = Field.GetAttribute("id")
                Dim newIntStepID = "Fi" + fiCount.ToString + "i-" + stepLeadingZeror
                Field.SetAttribute("id", newIntStepID)
                Debug.Write(vbCr + "old Step ID: " + initExistingStep + " /  new Step ID " + newIntStepID)
                dictionaryRenumberID.Add(initExistingStep, newIntStepID)
            ElseIf Field.Name = "isolationStep" Then
                For Each Attribute As XmlAttribute In Field.Attributes
                    If Attribute.Name = "id" Then
                        Dim existingStep = Field.GetAttribute("id")
                        newStepID = "Fi" + fiCount.ToString + "s-" + stepLeadingZeror
                        Field.SetAttribute("id", newStepID)
                        Debug.Write(vbCr + "old Step ID: " + existingStep + " /  new Step ID " + newStepID)
                        dictionaryRenumberID.Add(existingStep, newStepID)
                    End If
                Next
            ElseIf Field.Name = "isolationProcedureEnd" Then
                For Each Attribute As XmlAttribute In Field.Attributes
                    If Attribute.Name = "id" Then
                        Dim existingEndStep = Field.GetAttribute("id")
                        newEndStepID = "Fi" + fiCount.ToString + "e-" + stepLeadingZeror
                        Field.SetAttribute("id", newEndStepID)
                        Debug.Write(vbCr + "old End ID: " + existingEndStep + " /  new End ID " + newEndStepID)
                        dictionaryRenumberID.Add(existingEndStep, newEndStepID)
                    End If
                Next
            End If
            stepIndex += 1
        Next

1 Ответ

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

Использование XElement

    Dim xe As XElement
    ' xe=XElement.Load("path here")
    'for testing use a literal
    xe = <isolationMainProcedure>
             <isolationStep id="i-001">
                 <note>
                     <notePara>xxx xx</notePara>
                 </note>
                 <action>xxx xx<acronym id="rcm">xxx xx<acronymTerm>xxx xx</acronymTerm>xxx xx<acronymDefinition>xxx xx</acronymDefinition>xxx xx</acronym>xxx xx</action>
                 <isolationStepQuestion>xxx xx</isolationStepQuestion>
                 <isolationStepAnswer>
                     <yesNoAnswer>
                         <yesAnswer nextActionRefId="e-001"/>
                         <noAnswer nextActionRefId="s-001"/>
                     </yesNoAnswer>
                 </isolationStepAnswer>
             </isolationStep>
             <isolationProcedureEnd id="e-001">
                 <action>xxx xx<acronymTerm internalRefId="rcm">xxx xx</acronymTerm>xxx xx</action>
                 <action>xxx xx<dmRef>xxx xx<dmRefIdent>xxx xxxxx xx</dmRefIdent>xxx xx</dmRef>xxx xx</action>
             </isolationProcedureEnd>
             <isolationStep id="s-001">
                 <action>xxx xx</action>
                 <isolationStepQuestion>xxx xx</isolationStepQuestion>
                 <isolationStepAnswer>
                     <yesNoAnswer>
                         <yesAnswer nextActionRefId="s-002"/>
                         <noAnswer nextActionRefId="e-002"/>
                     </yesNoAnswer>
                 </isolationStepAnswer>
             </isolationStep>
             <isolationProcedureEnd id="e-002">
                 <action>xxx xx<acronym id="gcs">xxx xx<acronymTerm>xxx xx</acronymTerm>xxx xx<acronymDefinition>xxx xx</acronymDefinition>xxx xx</acronym>xxx xx<acronym id="sbs">xxx xx<acronymTerm>xxx xx</acronymTerm>xxx xx<acronymDefinition>xxx xx</acronymDefinition>xxx xx</acronym>xxx xx<acronym id="ramts">xxx xx<acronymTerm>xxx xx</acronymTerm>xxx xx<acronymDefinition>xxx xx</acronymDefinition>xxx xx</acronym>xxx xx</action>
                 <action>xxx xx<acronymTerm internalRefId="gcs">xxx xx</acronymTerm>xxx xx<acronymTerm internalRefId="sbs">xxx xx</acronymTerm>xxx xx<acronymTerm internalRefId="ramts">xxx xx</acronymTerm>xxx xx</action>
             </isolationProcedureEnd>
         </isolationMainProcedure>


    Dim ie As IEnumerable(Of XElement)

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

    'increment id
    For Each f As XElement In ie
        Dim IDAttr As XAttribute = f.Attribute("id")
        If IDAttr Is Nothing Then
            Stop 'NO id Attribute
        Else
            Stop 'has id Attribute
        End If
    Next
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...