我有一个XML文档,如果没有创建,我需要获取id属性的值(如果存在),然后将值分配给元素的第一次出现。我能够获取Field元素并设置一个新的id,但是在下一个其他设置中,如果刚设置的id属性被覆盖。我如何指定元素首次出现时为其他所有子代分配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
使用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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句