【问题标题】:Node value returns null for a XML Input节点值为 XML 输入返回 null
【发布时间】:2018-08-31 00:36:17
【问题描述】:

以下宏脚本出现错误。需要在单个表中提取日期、姓名和地址。由于 date 只有一个值,因此第二个值返回 null。

但是我需要相同的值出现在提取日期的所有记录中

Set ApplicationsNode = oXMLFile.SelectNodes("/Extract/Applications/Application")
Set extractnodes = oXMLFile.SelectNodes("/Extract/ExtractDate")
Set NameNode = oXMLFile.SelectNodes("/Extract/Applications/Application/Name/text()")
Set AddrNode = oXMLFile.SelectNodes("/Extract/Applications/Application/Addr/text()")

For i = 0 To (ApplicationsNode.Length - 1)

    Extract = extractnodes(i).NodeValue
    Name = NameNode(i).NodeValue
    Addr = AddrNode(i).NodeValue

    mainWorkBook.Sheets("Sheet1").Range("A" & i + 2).Value = Extract
    mainWorkBook.Sheets("Sheet1").Range("C" & i + 2).Value = Name
    mainWorkBook.Sheets("Sheet1").Range("D" & i + 2).Value = Addr

Next

输入 XML:

 <Extract>
     <ExtractDate>2018-02-21 10:01:01</ExtractDate>
       <Applications>
          <Application>         
             <Name>1234</Name>
             <Addr>700ST</Addr>
          </Application>    
       <Application>            
            <Name>123466</Name>
            <Addr>277AVD</Addr>
       </Application>
       <Applications>
      </Extract>

【问题讨论】:

  • 什么错误?在哪里?
  • 另外,XML 格式不正确。最后一行应该是&lt;/Application&gt; &lt;/Applications&gt; &lt;/Extract&gt;
  • 运行时错误 - 91:Extract = extractnodes(i).NodeValue 中出现对象变量或块变量未设置错误;因为节点值从输入 XML 返回空
  • 哪一行出错?
  • @Raja,修复 ashleedawg 已经指出的格式错误的 xml sn-p。我相信,您来这里是为了寻求一种解决方案,不要将其他人与您在上面粘贴的部分元素混淆。

标签: xml vba excel nodevalue


【解决方案1】:

尝试在桌面中使用content.xml 文件中的以下元素部分并运行以下代码。

content.xml 文件内:

<Extract>
    <ExtractDate>2018-02-21 10:01:01</ExtractDate>
    <Applications>
        <Application>         
            <Name>1234</Name>
            <Addr>700ST</Addr>
        </Application>    
        <Application>            
            <Name>123466</Name>
            <Addr>277AVD</Addr>
        </Application>
    </Applications>
</Extract>

解析值的脚本:

Sub DemoXML()
    Dim post As Object

    With CreateObject("MSXML2.DOMDocument")
        .async = False: .validateOnParse = False
        .Load (ThisWorkbook.path & "\content.xml")

        For Each post In .SelectNodes("//Extract//Application")
            r = r + 1: Cells(r, 1) = post.ParentNode.ParentNode.FirstChild.Text
            Cells(r, 2) = post.SelectNodes(".//Name")(0).Text
            Cells(r, 3) = post.SelectNodes(".//Addr")(0).Text
        Next post
    End With
End Sub

填充结果:

2/21/2018 10:01 1234    700ST
2/21/2018 10:01 123466  277AVD

【讨论】:

  • 不错!一个附带问题:r=r+1 后面的冒号是什么意思?
  • 使用冒号可以在一行中容纳多行。那是没有必要使用的。但是,我这样做是为了节省空间。
  • 感谢您的回复。你能说出 For Each post In .SelectNodes("//Extract//Application") ***“//”是什么意思吗? *** 如果我使用 FIlename.SelectNode 而不是 .SelectNode 会发生什么
【解决方案2】:

已经给出了更好的答案,但这里有一个变体:

Option Explicit
Public Sub DemoXML()
    Dim post As Object, R As Long, C As Long, dateString As String
    With CreateObject("MSXML2.DOMDocument")
         .async = False: .validateOnParse = False
        .Load "C:\Users\User\Desktop\random.xml"
        dateString = .SelectSingleNode("//ExtractDate").Text

        For Each post In .SelectNodes("//Application")
            R = R + 1: Cells(R, 1) = dateString
            Cells(R, 2) = post.FirstChild.Text
            Cells(R, 3) = post.LastChild.Text
        Next post
    End With
End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-21
    • 1970-01-01
    • 2017-03-20
    • 2019-08-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多