XML проверить, если атрибут не существует - PullRequest
0 голосов
/ 25 февраля 2020

У меня есть файл XML с узлами faultIsolationProcedure, которые имеют и не имеют атрибутов applicationRefId. Мне нужно проверить, существует ли атрибут в узле faultIsolationProcedure. Если он не существует, ему нужно получить атрибут faultCode дочерних элементов неисправности и создать для него значение applyRefID faultIsolationProcedure.

Это мой код, но он не работает. Я хотел, чтобы hasAttr был логическим, но я получил от него ошибку типа.

code

      For Each node As XmlNode In doc.SelectNodes("/dmodule/content/faultIsolation/faultIsolationProcedure")
        Dim hasAttr = node.Attributes["applicRefId"] != null
        If hasAttr! = null Then

            Me.ListBox1.Items.Add(String.Format("{0}",
                                            node.Attributes("applicRefId").InnerText))
        End If
    Next

Sample XML

<content>
    <faultIsolation>
        <faultIsolationProcedure applicRefId="Blk1">
            <fault faultCode="48-038"/>
            <faultDescr>
                <descr>xxx xx</descr>
            </faultDescr>
            <isolationProcedure>
                <isolationMainProcedure>
                    <isolationStep id="i-001">
                        <action>xxx xxxxx 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 xxxxx xx</action>
                        <action>xxx xx</action>
                    </isolationProcedureEnd>
                </isolationMainProcedure>
            </isolationProcedure>
        </faultIsolationProcedure>
        <faultIsolationProcedure>
            <fault faultCode="48-039"/>
            <faultDescr>
                <descr>xxx xx</descr>
            </faultDescr>
            <isolationProcedure>
                <isolationMainProcedure>
                    <isolationStep id="i-001">
                        <action>xxx xxxxx 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 xxxx xx</action>
                        <action>xxx xx<dmRef>
                        </dmRef>xxx xx</action>
                    </isolationProcedureEnd>
                </isolationMainProcedure>
            </isolationProcedure>
        </faultIsolationProcedure>
    </faultIsolation>
</content>

1 Ответ

1 голос
/ 26 февраля 2020

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

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

        Dim faultIsolationProcedures As List(Of XElement) = doc.Descendants("faultIsolationProcedure").Where(Function(x) x.Attribute("applicRefId") Is Nothing).ToList()

        For Each faultIsolationProcedure In faultIsolationProcedures
            faultIsolationProcedure.SetAttributeValue("applicRefId", "Blk1")
        Next faultIsolationProcedure
    End Sub

End Module
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...