我正在尝试使用以下方法从XML文档中获取<content>
节点:
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="""39""">" & _
"<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
。我认为一定存在名称空间问题,因为我能够使用以下命令成功查询Id
:
xmldoc.SelectSingleNode("//d:Id")
那么如何查询标记名称在默认名称空间中的节点?
更新:QHarr的答案是正确的,但是如果我要查询默认名称空间和另一个名称空间,则需要如下设置多个名称空间:
xmlNamespace = "xmlns:d='schemas.microsoft.com/ado/2007/08/dataservices' xmlns:content='w3.org/2005/Atom'"
答案 0 :(得分:1)
在顶部添加名称空间
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="""39""">" & _
"<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