Excel VBA和XML快速查找childnode索引

Excel VBA和XML快速查找childnode索引,excel,xml,vba,Excel,Xml,Vba,是否有可能在没有循环的情况下提取childnode索引 问题是一个have指定的查询,无法修改公司数据库。 脚本将以XML格式返回结果 问题是,这个指定的查询返回10000多个节点,每个节点有30个子节点。这个乘以100 是否有可能根据以下事实来定位和设置节点的索引,即我正在使用childnode搜索索引,我知道该索引的值 不幸的是,循环需要相当长的时间,我想让它快一点 总之: 我想索引节点行的位置,其中element1有一个值=“element1.3” 如果该元素不存在,则返回false。 如

是否有可能在没有循环的情况下提取childnode索引

问题是一个have指定的查询,无法修改公司数据库。 脚本将以XML格式返回结果

问题是,这个指定的查询返回10000多个节点,每个节点有30个子节点。这个乘以100

是否有可能根据以下事实来定位和设置节点的索引,即我正在使用childnode搜索索引,我知道该索引的值

不幸的是,循环需要相当长的时间,我想让它快一点

总之: 我想索引节点行的位置,其中element1有一个值=“element1.3”

如果该元素不存在,则返回false。 如果存在,则从此节点、元素2和元素3提取

这是一个示例,在实际代码中,我想从此行中提取更多值

<row>
 <element1>elementone</element1>
 <element2>elementtwo</element2>
 <element3>elementthree</element3>
</row>
<row>
 <element1>element1.2</element1>
 <element2>element2.2</element2>
 <element3>element3.2</element3>
</row>
<row>
 <element1>element1.3</element1>
 <element2>element2.3</element2>
 <element3>element3.3</element3>
</row>
<row>
 <element1>element1.4</element1>
 <element2>element2.4</element2>
 <element3>element3.4</element3>
</row>
<row>
 <element1>element1.4</element1>
 <element2>element2.4</element2>
 <element3>element3.4</element3>
</row>

元素一
元素二
元素三
要素1.2
要素2.2
要素3.2
要素1.3
要素2.3
要素3.3
要素1.4
要素2.4
要素3.4
要素1.4
要素2.4
要素3.4
问候,,
KM

好的Xpath似乎确实起到了作用

在我使用以下代码之前:

set row = domdoc.SelectNodes("/row[element1='" & "element1.3" & "']")
其中正确的应该是,因为行是父节点:

set row = domdoc.SelectNodes("//row[element1='" & "element1.3" & "']")

实际上,这将只返回包含我需要的子子子节点的行。

好的Xpath似乎确实起到了作用

在我使用以下代码之前:

set row = domdoc.SelectNodes("/row[element1='" & "element1.3" & "']")
其中正确的应该是,因为行是父节点:

set row = domdoc.SelectNodes("//row[element1='" & "element1.3" & "']")

实际上,这将只返回包含我需要的子子子节点的行。

获取XML节点索引

“是否有可能根据以下事实来定位和设置节点的索引:我正在使用childnode搜索我知道其值的索引。”

由于OP中的问题实际上要求快速搜索节点索引,因此我演示了如何通过XPath查询获取(基于1的)索引号。正如您所知,您可以通过位置号(索引号)直接引用每个节点名称,例如,通过
//行[3]
引用第三行

我假设
标记紧跟在层次结构中的文档元素之后(大致相当于web文档结构中的
标记)

示例呼叫

Sub TestNodeIndex()

'[0]declare xml vars/objects
    Dim xFile   As String: xFile = "rowsindex.xml"  ' <<  change to your needs
    Dim xDoc    As MSXML2.DOMDocument60             ' <<  reference to Microsoft XML, v6.0
    Set xDoc = New MSXML2.DOMDocument60             ' set early bound xml doc object instance to memory
'[1]load xml file
    If Not xDoc.Load(ThisWorkbook.Path & "\xml\" & xFile) Then
        MsgBox "XML File not found.", vbExclamation
        Exit Sub
    End If
'[2]find (first) occurrence of a row node where child node element1 has a text value of 'element1.3'
    Dim xRow As MSXML2.IXMLDOMNode
    Set xRow = xDoc.DocumentElement.SelectSingleNode("row[element1='" & "element1.3" & "']")
'[3]show 1-based index of found node (0 = not found)
    Dim pos As Long: pos = NodeIndex(xRow, "row")
    Debug.Print "Node index = " & IIf(pos, pos, "N/A")
End Sub
帮助功能
NodeIndex()

Function NodeIndex(curNode As MSXML2.IXMLDOMNode, Optional ByVal tag = "row") As Long
'Purpose: get node index of current node
'Method : count preceding nodes adding current node (+1)
'a) escape if nothing found
    If curNode Is Nothing Then NodeIndex = 0: Exit Function ' if no search result
'b) return node index as function result
    NodeIndex = curNode.SelectNodes("preceding-sibling::" & tag).Length + 1
End Function


获取XML节点索引

“是否有可能根据以下事实来定位和设置节点的索引:我正在使用childnode搜索我知道其值的索引。”

由于OP中的问题实际上要求快速搜索节点索引,因此我演示了如何通过XPath查询获取(基于1的)索引号。正如您所知,您可以通过位置号(索引号)直接引用每个节点名称,例如,通过
//行[3]
引用第三行

我假设
标记紧跟在层次结构中的文档元素之后(大致相当于web文档结构中的
标记)

示例呼叫

Sub TestNodeIndex()

'[0]declare xml vars/objects
    Dim xFile   As String: xFile = "rowsindex.xml"  ' <<  change to your needs
    Dim xDoc    As MSXML2.DOMDocument60             ' <<  reference to Microsoft XML, v6.0
    Set xDoc = New MSXML2.DOMDocument60             ' set early bound xml doc object instance to memory
'[1]load xml file
    If Not xDoc.Load(ThisWorkbook.Path & "\xml\" & xFile) Then
        MsgBox "XML File not found.", vbExclamation
        Exit Sub
    End If
'[2]find (first) occurrence of a row node where child node element1 has a text value of 'element1.3'
    Dim xRow As MSXML2.IXMLDOMNode
    Set xRow = xDoc.DocumentElement.SelectSingleNode("row[element1='" & "element1.3" & "']")
'[3]show 1-based index of found node (0 = not found)
    Dim pos As Long: pos = NodeIndex(xRow, "row")
    Debug.Print "Node index = " & IIf(pos, pos, "N/A")
End Sub
帮助功能
NodeIndex()

Function NodeIndex(curNode As MSXML2.IXMLDOMNode, Optional ByVal tag = "row") As Long
'Purpose: get node index of current node
'Method : count preceding nodes adding current node (+1)
'a) escape if nothing found
    If curNode Is Nothing Then NodeIndex = 0: Exit Function ' if no search result
'b) return node index as function result
    NodeIndex = curNode.SelectNodes("preceding-sibling::" & tag).Length + 1
End Function


你们研究过xpath吗?不幸的是,我并没有找到适合这些需求的xpath函数,但可能是我做错了什么。我试图做的是:设置row=domdoc.SelectNodes(“/row[element1=”&“element1.3”&“]),其中“element1.3”介于和之间,因为这不是一个常量值,我使用声明的字符串搜索它。但这并没有起作用。你们研究过xpath吗?不幸的是,我并没有找到适合这些需要的xpath函数,但可能是我做错了什么。我试图做的是:设置row=domdoc.SelectNodes(“/row[element1=”&“element1.3”&“]),其中“element1.3”介于和之间,因为这不是一个常量值,我使用声明的字符串搜索它。但这不起作用。这确实会设置行节点的节点列表(或者:
set xRow=xDoc.DocumentElement.SelectNodes(“row[element1=”&“element1.3”&“])
);但是,您不是要求获取在帖子中找到的节点的当前索引号吗?双斜杠仅表示搜索任何节点层次结构,包括document元素,而不显式引用document元素:-)是的,起初我想提取索引并设置它,但我已经抓住了稻草。我认为无法通过childnode值设置它们,这只是我必须解决的一个想法。这确实会设置行节点的节点列表(或者:
set xRow=xDoc.DocumentElement.SelectNodes(“row[element1=”&“element1.3”&“])
);但是,您不是要求获取在帖子中找到的节点的当前索引号吗?双斜杠仅表示搜索任何节点层次结构,包括document元素,而不显式引用document元素:-)是的,起初我想提取索引并设置它,但我已经抓住了稻草。我认为没有办法通过childnode值来设置它们,这只是我必须解决的一个想法。谢谢,这可能对我遇到的另一个问题有帮助:)谢谢,这可能对我遇到的另一个问题有帮助:)