【问题标题】:How to find get a value of XML tag in VBA如何在 VBA 中查找获取 XML 标记的值
【发布时间】:2017-02-02 13:37:07
【问题描述】:

我有一个如下所示的 XML 文档:

<p id="name">Rahul</P>
<p id="job">ABC Corp</P>
<p id="empid">12345</p>
<p id="age">30</p>

现在我想提取下面的标签值:

<p id="empid">12345</p>

12345

我尝试使用InStr,但读取 XML 文档并找到所有值需要花费大量时间。

【问题讨论】:

  • 您可能会使用类似于此处发布的内容,因为它看起来也可以传递给 HTML。 stackoverflow.com/questions/25488687/parse-html-content-in-vba
  • @Jinx88909 感谢您的建议。我会照顾的
  • @BYates 让我具体说一下,实际上我们从供应商那里收到这些类型的数据(既不是纯 XML 也不是 HTML),这些数据存储在我们临时表的列中,所以我们的任务是过滤掉使用 vba 列中的 empid 值。那些不包含所需empid标签的文件将被插入到拒绝表中。
  • @user3928562 所以我们会在数据库或其他文件中过滤这些记录?数据存储在什么地方?如果它是一个数据库,您可以通过 SQL 语句或遍历记录集来过滤这些。如果是Excel,cxw下面有一个潜在的解决方案。
  • 对了,欢迎来到本站!查看tour 了解更多关于预期的信息,并查看how-to-ask 页面了解更多关于编写能够吸引高质量答案的问题(如下面的问题;) :))。

标签: xml vba excel xml-parsing text-parsing


【解决方案1】:

如果我对your comment 的理解正确,那么您就有一堆XML 作为字符串。也就是说,在工作表的一个单元格中是这样的:

<p id="name">Rahul</P> <p id="job">ABC Corp</P> <p id="empid">12345</p> <p id="age">30</p>

现在,you should never use regular expressions to parse HTML or XML。也就是说,let's use regular expressions!在工具 |引用,添加对Microsoft VBScript Regular Expressions 5.5的引用。

Option Explicit
Option Base 0

Public Sub EmpID()
    Dim re As VBScript_RegExp_55.RegExp
    Set re = New VBScript_RegExp_55.RegExp
    re.Pattern = "empid""\s*>\s*([0-9]+)"
        ' A pattern that matches the end of the empid tag
        ' and the following numerical empid value.

    Dim matches As VBScript_RegExp_55.MatchCollection
    Dim match As VBScript_RegExp_55.match
    Set matches = re.Execute(ActiveSheet.Range("A1"))
        ' Or whatever text you want ^^^^^^^^^^^^^^^^

    For Each match In matches
        Debug.Print match.SubMatches(0)    ' The number
        ' Or whatever you want to do with it
    Next match
End Sub

在我的 Excel 2013 上,这会将 12345 输出到调试控制台,使用上面的输入。

【讨论】:

    【解决方案2】:

    您需要 Microsoft XML v6.0 的参考集

    假设您的 XML 看起来像这样(我添加了一个根节点。这是获取您要搜索的节点的路径所必需的)

    <Root>
         <p id="name">Rahul</p>
         <p id="job">ABC Corp</p>
         <p id="empid">12345</p>
         <p id="age">30</p>
    </Root>
    

    尽管您可以更改要搜索的字符串,但以下代码将打印“12345”。

    Sub Test()
    Dim xDoc As New MSXML2.DOMDocument60
    Dim xNode As MSXML2.IXMLDOMElement
    Dim strPath As String
    Dim strSearch As String
    
    strSearch = "empid"
    strPath = "Path to XML file here"
    'Try To Load The Document
    With xDoc
        If Not .Load(strPath) Then
            'Not Loaded. Display Error And Exit
            MsgBox "Unable to load"
            Exit Sub
        End If
        'Get The Node Where The id Attribute = Your Search String
        Set xNode = .SelectSingleNode("//Root/p[@id='" & strSearch & "']")
        'Only Proceed If A Node Is Found
        If Not xNode Is Nothing Then
            Debug.Print xNode.Text
        End If
    End With
    
    End Sub
    

    【讨论】:

      猜你喜欢
      • 2012-07-06
      • 2018-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-20
      • 1970-01-01
      相关资源
      最近更新 更多