代码之家  ›  专栏  ›  技术社区  ›  sigil

尝试在VBA中按标记名查询XML节点,可能是命名空间问题?

  •  1
  • sigil  · 技术社区  · 7 年前

    我正试图得到 <content> 来自XML文档的节点,使用:

    Private Sub test1()
    
    Dim xmldoc As MSXML2.DOMDocument60
    Dim xmlNamespace As String
    Dim nodeList As MSXML2.IXMLDOMNodeList
    Dim node As MSXML2.IXMLDOMNode
    Dim xml As String
    
    Set xmldoc = New MSXML2.DOMDocument60
    xmlNamespace = "xmlns:d='http://schemas.microsoft.com/ado/2007/08/dataservices' xmlns='http://www.w3.org/2005/Atom'"
    xmldoc.setProperty "SelectionNamespaces", xmlNamespace
    xmldoc.setProperty "SelectionLanguage", "XPath"
    
    xml = "<?xml version=""1.0""?>" & _
        "<entry xml:base=""https://example.com/Sites/xyz/_api/"" xmlns=""http://www.w3.org/2005/Atom"" xmlns:d=""http://schemas.microsoft.com/ado/2007/08/dataservices"" xmlns:m=""http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"" xmlns:georss=""http://www.georss.org/georss"" xmlns:gml=""http://www.opengis.net/gml"" m:etag=""&quot;39&quot;"">" & _
        "<id>Web/Lists(guid'abc')/Items(597)</id>" & _
        "<category term=""SP.Data.xListItem"" scheme=""http://schemas.microsoft.com/ado/2007/08/dataservices/scheme""/>" & _
        "<link rel=""edit"" href=""Web/Lists(guid'abc')/Items(597)""/>" & _
        "<title/>" & _
        "<updated>2018-07-28T02:06:34Z</updated>" & _
        "<author>" & _
        "<name/>" & _
        "</author>" & _
        "<content type=""application/xml"">" & _
        "<m:properties>" & _
        "<d:Id m:type=""Edm.Int32"">597</d:Id>" & _
        "<d:xId m:type=""Edm.Int32"">59</d:xId>" & _
        "<d:x2Id m:type=""Edm.Int32"">0</d:x2Id>" & _
        "<d:ID m:type=""Edm.Int32"">597</d:ID>" & _
        "</m:properties>" & _
        "</content>" & _
        "</entry>"
    
    
    xmldoc.LoadXML xml
    Set node = xmldoc.SelectSingleNode("//content")
    
    End Sub
    

    这个 node 值始终设置为 nothing ,无论我是使用“content”还是“//content”。我认为一定有命名空间问题,因为我能够成功地查询 Id 使用:

    xmldoc.SelectSingleNode("//d:Id")
    

    那么,如何查询标记名在默认命名空间中的节点?

    更新:QHarr的答案是正确的,但是如果我想同时查询默认名称空间和另一个名称空间,我需要设置多个名称空间,如下所示:

    xmlNamespace = "xmlns:d='schemas.microsoft.com/ado/2007/08/dataservices' xmlns:content='w3.org/2005/Atom'"
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   QHarr    7 年前

    在顶部添加命名空间

    xmldoc.setProperty "SelectionNamespaces", "xmlns:content=""http://www.w3.org/2005/Atom"""
    

    代码:

    Option Explicit
    
    Private Sub test1()
    
        Dim xmldoc As MSXML2.DOMDocument60
        Dim xmlNamespace As String
        Dim nodeList As MSXML2.IXMLDOMNodeList
        Dim node As MSXML2.IXMLDOMNode
        Dim xml As String
    
        Set xmldoc = New MSXML2.DOMDocument60
        xmlNamespace = "xmlns:d='http://schemas.microsoft.com/ado/2007/08/dataservices' xmlns='http://www.w3.org/2005/Atom'"
        xmldoc.setProperty "SelectionNamespaces", xmlNamespace
        xmldoc.setProperty "SelectionLanguage", "XPath"
        xmldoc.setProperty "SelectionNamespaces", "xmlns:content=""http://www.w3.org/2005/Atom"""
    
        xml = "<?xml version=""1.0""?>" & _
              "<entry xml:base=""https://example.com/Sites/xyz/_api/"" xmlns=""http://www.w3.org/2005/Atom"" xmlns:d=""http://schemas.microsoft.com/ado/2007/08/dataservices"" xmlns:m=""http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"" xmlns:georss=""http://www.georss.org/georss"" xmlns:gml=""http://www.opengis.net/gml"" m:etag=""&quot;39&quot;"">" & _
              "<id>Web/Lists(guid'abc')/Items(597)</id>" & _
              "<category term=""SP.Data.xListItem"" scheme=""http://schemas.microsoft.com/ado/2007/08/dataservices/scheme""/>" & _
              "<link rel=""edit"" href=""Web/Lists(guid'abc')/Items(597)""/>" & _
              "<title/>" & _
              "<updated>2018-07-28T02:06:34Z</updated>" & _
              "<author>" & _
              "<name/>" & _
              "</author>" & _
              "<content type=""application/xml"">" & _
              "<m:properties>" & _
              "<d:Id m:type=""Edm.Int32"">597</d:Id>" & _
              "<d:xId m:type=""Edm.Int32"">59</d:xId>" & _
              "<d:x2Id m:type=""Edm.Int32"">0</d:x2Id>" & _
              "<d:ID m:type=""Edm.Int32"">597</d:ID>" & _
              "</m:properties>" & _
              "</content>" & _
              "</entry>"
    
          If Not xmldoc.LoadXML(xml) Then
            Err.Raise xmldoc.parseError.ErrorCode, , xmldoc.parseError.reason
            Exit Sub
        End If
    
        Set node = xmldoc.SelectSingleNode("//content:content")
        Debug.Print node.Text
    End Sub