VB.Net XmlDocument.SelectNodes(xPath): 无法查询 WSDL
VB.Net XmlDocument.SelectNodes(xPath): unable to query WSDL
我正在尝试从 VB.Net 中的 Alfresco WSDL 读取 SOAP 地址。
XML 看起来像这样:
<?xml version="1.0" encoding="utf-8"?>
<definitions xmlns:cmis="http://docs.oasis-open.org/ns/cmis core/200908/" xmlns:cmism="http://docs.oasis-open.org/ns/cmis/messaging/200908/" xmlns:cmisw="http://docs.oasis-open.org/ns/cmis/ws/200908/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:ns="http://schemas.xmlsoap.org/soap/encoding/" targetNamespace="http://docs.oasis-open.org/ns/cmis/ws/200908/" xmlns:jaxws="http://java.sun.com/xml/ns/jaxws" name="CMISWebServices">
...
<message name="cmisException">
<part name="fault" element="cmism:cmisFault" />
</message>
...
<service name="ACLService">
<port name="ACLServicePort" binding="cmisw:ACLServicePortBinding">
<soap:address location="https://myserver:8443/alfresco/cmisws/ACLService" />
</port>
</service>
...
这是我的 VB.Net 代码。我正在尝试将 XmlDocument.SelectNodes()
与 XPath 查询一起使用......但我并不高兴。
Dim xmlReader As System.Xml.XmlTextReader = New XmlTextReader(urlWsdl)
Dim xmlWsdl As System.Xml.XmlDocument = New XmlDocument
xmlWsdl.Load(xmlReader)
...
Dim xPath As String = "/definitions/service[@name='" & sService & "']"
Dim serviceNodes As XmlNodeList
While True
Try
serviceNodes = xmlWsdl.SelectNodes(xPath)
PrintMsg("Count=" & serviceNodes.Count)
Catch ex As Exception
Logger.LogMsg("ERROR: " & ex.Message)
End Try
End While
...
我需要从 WSDL 获取几个不同服务的地址位置:"ACLService"、"DiscoveryService"、"MultiFilingService"、"NavigationService" 等
我尝试了许多不同的 XPath 表达式,但我总是得到 "serviceNodes.Count" of "0":
Dim serviceNodes As XmlNodeList = xmlWsdl.SelectNodes(xPath):
XPath: Count: ServicesNodes(0).OuterXml:
----- ----- -------------------------
//service[@name='ACLService'] 0
//service[@name=ACLService] 0
//service 0
* 1 OuterXml: "<definitions ...>... // Entire XML document
/definitions//service[@name=ACLService] 0
/definitions/service[@name='ACLService'] 0
/definitions/service 0
问:我做错了什么?
问:我该如何解决?
============================================= ======
非常感谢 har07,他正确地指出我需要使用 XmlNamespaceManager。
这是更新后的代码:
Dim nsManager As New XmlNamespaceManager(New NameTable())
nsManager.AddNamespace("afws", xmlWsdl.DocumentElement.NamespaceURI)
Dim xPath As String = "/afws:definitions/afws:service[@name='" & sService & "']"
Dim serviceNodes As XmlNodeList = xmlWsdl.SelectNodes(xPath, nsManager) ' Now works perfectly!
"What am I doing wrong?"
您的 XPath 没有考虑 默认命名空间,这里声明的没有前缀:xmlns="http://schemas.xmlsoap.org/wsdl/"
。 (有关详细信息,请参阅 this MSDN article 中的 默认命名空间 部分)。
"What can I do to fix it?"
使用 XmlNamespaceManager
注册前缀到默认命名空间 URI 的映射,然后在您的 XPath 中正确使用注册的前缀,例如:
....
Dim nsManager As New XmlNamespaceManager(New NameTable())
nsManager.AddNamespace("d", xmlWsdl.DocumentElement.NamespaceURI)
Dim xPath As String = "/d:definitions/d:service[@name='" & sService & "']"
....
serviceNodes = xmlWsdl.SelectNodes(xPath, nsManager)
我正在尝试从 VB.Net 中的 Alfresco WSDL 读取 SOAP 地址。
XML 看起来像这样:
<?xml version="1.0" encoding="utf-8"?>
<definitions xmlns:cmis="http://docs.oasis-open.org/ns/cmis core/200908/" xmlns:cmism="http://docs.oasis-open.org/ns/cmis/messaging/200908/" xmlns:cmisw="http://docs.oasis-open.org/ns/cmis/ws/200908/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:ns="http://schemas.xmlsoap.org/soap/encoding/" targetNamespace="http://docs.oasis-open.org/ns/cmis/ws/200908/" xmlns:jaxws="http://java.sun.com/xml/ns/jaxws" name="CMISWebServices">
...
<message name="cmisException">
<part name="fault" element="cmism:cmisFault" />
</message>
...
<service name="ACLService">
<port name="ACLServicePort" binding="cmisw:ACLServicePortBinding">
<soap:address location="https://myserver:8443/alfresco/cmisws/ACLService" />
</port>
</service>
...
这是我的 VB.Net 代码。我正在尝试将 XmlDocument.SelectNodes()
与 XPath 查询一起使用......但我并不高兴。
Dim xmlReader As System.Xml.XmlTextReader = New XmlTextReader(urlWsdl)
Dim xmlWsdl As System.Xml.XmlDocument = New XmlDocument
xmlWsdl.Load(xmlReader)
...
Dim xPath As String = "/definitions/service[@name='" & sService & "']"
Dim serviceNodes As XmlNodeList
While True
Try
serviceNodes = xmlWsdl.SelectNodes(xPath)
PrintMsg("Count=" & serviceNodes.Count)
Catch ex As Exception
Logger.LogMsg("ERROR: " & ex.Message)
End Try
End While
...
我需要从 WSDL 获取几个不同服务的地址位置:"ACLService"、"DiscoveryService"、"MultiFilingService"、"NavigationService" 等
我尝试了许多不同的 XPath 表达式,但我总是得到 "serviceNodes.Count" of "0":
Dim serviceNodes As XmlNodeList = xmlWsdl.SelectNodes(xPath):
XPath: Count: ServicesNodes(0).OuterXml:
----- ----- -------------------------
//service[@name='ACLService'] 0
//service[@name=ACLService] 0
//service 0
* 1 OuterXml: "<definitions ...>... // Entire XML document
/definitions//service[@name=ACLService] 0
/definitions/service[@name='ACLService'] 0
/definitions/service 0
问:我做错了什么?
问:我该如何解决?
============================================= ======
非常感谢 har07,他正确地指出我需要使用 XmlNamespaceManager。
这是更新后的代码:
Dim nsManager As New XmlNamespaceManager(New NameTable())
nsManager.AddNamespace("afws", xmlWsdl.DocumentElement.NamespaceURI)
Dim xPath As String = "/afws:definitions/afws:service[@name='" & sService & "']"
Dim serviceNodes As XmlNodeList = xmlWsdl.SelectNodes(xPath, nsManager) ' Now works perfectly!
"What am I doing wrong?"
您的 XPath 没有考虑 默认命名空间,这里声明的没有前缀:xmlns="http://schemas.xmlsoap.org/wsdl/"
。 (有关详细信息,请参阅 this MSDN article 中的 默认命名空间 部分)。
"What can I do to fix it?"
使用 XmlNamespaceManager
注册前缀到默认命名空间 URI 的映射,然后在您的 XPath 中正确使用注册的前缀,例如:
....
Dim nsManager As New XmlNamespaceManager(New NameTable())
nsManager.AddNamespace("d", xmlWsdl.DocumentElement.NamespaceURI)
Dim xPath As String = "/d:definitions/d:service[@name='" & sService & "']"
....
serviceNodes = xmlWsdl.SelectNodes(xPath, nsManager)