如何有效地检查不同的根节点

时间:2013-09-30 16:28:12

标签: asp.net xml vb.net

我有一个ASP.NET(VB)用户控件,我将要加载XML文档。此文档可能具有两个可能的根节点名称之一。我有3个可能的xsl文件需要通过.NET预先添加到xml文件中。添加xsl引用不是问题,但我遇到了确定要添加的WHICH xsl文件的问题。

在加载XML文档之后,我需要确定的第一件事是根节点。它可以是

<Document xmlns="urn:hl7-org:v3">
  <templateId root="usetemplate_1" />

<Document xmlns="urn:hl7-org:v3">
  <templateId root="usetemplate_2" />

<Record xmlns="urn:astm-org:REC">
  <objectId>useobjectid</objectId>

注意前两个有一个命名空间,第三个有不同的命名空间(不知道如何在我的大脑中调和它)。

这些选项中的每一个都有一个不同的xsl文件要引用。在我可以重用的另一个地方,我有类似的代码,正如我所说,这只是确定要引用的正确文件的问题。到目前为止我已经有了这个:

Dim m_xmld As XmlDocument
Dim m_nodelist As XmlNodeList
Dim m_node As XmlNode
m_xmld = New XmlDocument
m_xmld.Load(Me.XMLFileName)

Dim nsmgr As New XmlNamespaceManager(m_xmld.NameTable)
nsmgr.AddNamespace("x", "urn:hl7-org:v3")
m_nodelist = m_xmld.SelectNodes("x:Document/", nsmgr)

For Each m_node In m_nodelist
Next

我只是想知道在每个/下一行之间放什么来确定上面的选项中的哪一个,或者是否甚至是必要的,并且可以以不同的方式更有效地完成。

1 个答案:

答案 0 :(得分:1)

这应该有效:

Dim m_xmld As New XmlDocument()
m_xmld.Load(Me.XMLFileName)
Dim nsmgr As New XmlNamespaceManager(m_xmld.NameTable)
nsmgr.AddNamespace("h", "urn:hl7-org:v3")
nsmgr.AddNamespace("a", "urn:astm-org:REC")
If m_xmld.SelectSingleNode("/h:Document/h:templateId[@root='usetemplate_1']", nsmgr) IsNot Nothing Then
    ' Use xsl A
ElseIf m_xmld.SelectSingleNode("/h:Document/h:templateId[@root='usetemplate_2']", nsmgr) IsNot Nothing Then
    ' Use xsl B
ElseIf m_xmld.SelectSingleNode("/a:Record/a:objectId", nsmgr) IsNot Nothing Then
    ' Use xsl C
End If

或者,如果Select Case更有意义,您可以获取属性的值,如下所示:

Dim root As XmlNode = doc.SelectSingleNode("/h:Document/h:templateId/@root", nsmgr)
If root IsNot Nothing Then
    Select Case root.InnerText
        Case "usetemplate_1"
            ' Use xsl A
        Case "usetemplate_2"
            ' Use xsl B
    End Select
ElseIf doc.SelectSingleNode("/a:Record/a:objectId", nsmgr) IsNot Nothing Then
    ' Use xsl C
End If

您可以根据需要向命名空间管理器添加任意数量的命名空间。即使命名空间实际上没有在XML文档中的任何地方使用,这也不会成为问题。因此,正如您所看到的,您可以同时添加两个潜在的命名空间。