【问题标题】:XmlDocument loops through too many timesXmlDocument 循环次数过多
【发布时间】:2020-03-04 19:00:04
【问题描述】:

我有一个包含多个 faultIsolationProcedures 的 XML 文档,我需要增加 ID 号。代码工作除了它计数的每个 faultIsolationProcedure 3 次。我尝试过使用不同的 XPath 表达式,但总是出现奇怪的 3 次循环。

代码:

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>

【问题讨论】:

  • 设置选项严格。你可能会发现一些东西!
  • 您是打算renumNodes.Attributes("id").Value 还是应该是fi.Attributes("id").Value
  • 我将其更改为 fi.Attributes("id").Value 但现在出现错误“Option Strict on disallows late binding”@AndrewMorton
  • @JenPann 循环必须是For Each fi As XmlNode In renumNodes
  • 我现在得到错误对象引用未设置为对象的实例。在 Dim origFild = fi.Attribute("id").value @AndrewMorton

标签: xml vb.net


【解决方案1】:

使用我觉得更容易的 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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2012-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-06
  • 2014-04-01
  • 1970-01-01
相关资源
最近更新 更多