【问题标题】:XML check if attribute does not existXML 检查属性是否不存在
【发布时间】:2025-11-25 19:50:01
【问题描述】:

我有一个带有 faultIsolationProcedure 节点的 XML 文件,这些节点具有和不具有 applicRefId 属性。我需要检查 faultIsolationProcedure 节点中是否存在该属性。如果它不存在,则需要获取子故障元素的 faultCode 属性并使用它创建填充 faultIsolationProcedure 的 applicRefID。

这是我的代码,但它不起作用。我希望 hasAttr 是布尔值,但我收到了一个类型错误。

代码

      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

示例 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>

【问题讨论】:

    标签: xml vb.net


    【解决方案1】:

    试试 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
    

    【讨论】: