这是我的代码:
path = wsdlPath;
SAXParserFactory saxfac = SAXParserFactory.newInstance();
saxfac.setNamespaceAware(true);
saxfac.setXIncludeAware(true);
saxfac.setValidating(false);
SAXParser saxParser = saxfac.newSAXParser();
saxParser.parse(wsdlPath, this);
设置setNamespaceAware=true
后,我无法获取方法xmlns:XXX
的参数attributes
中的public void startElement(String uri, String localName, String qName, Attributes attributes)
属性。
表示以下节点:
<definitions name="Service1"
targetNamespace="http://www.test.com/service"
xmlns="http://schemas.xmlsoap.org/wsdl/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/"
xmlns:http="http://schemas.xmlsoap.org/wsdl/http/"
xmlns:tns="http://www.test.com/">
我只获得name
和targetNamespace
属性。 xmlns
,xmlns:wsdl
,xmlns:mime
,xmlns:http
和xmlns:tns
位于attributes
参数中。但它们无法访问。
有没有办法使用setNamespaceAware=true
并获取节点的所有属性?
答案 0 :(得分:8)
当您的XML解析器知道XML Namespace时,您不应该需要访问这些属性,因为它们只定义XML中使用的命名空间的短名称。
在这种情况下,您始终使用其全名(例如http://schemas.xmlsoap.org/wsdl/
)来引用名称空间,并且可以忽略它们在XML中的别名短名称(例如wsdl
)。
SAX不提供这些值的事实记录在Attributes
class:
它将不包含用作命名空间声明(
xmlns*
)的属性,除非http://xml.org/sax/features/namespace-prefixes
功能设置为true
(默认为false
)。
因此,使用saxfac.setFeature("http://xml.org/sax/features/namespace-prefixes", true)
可以帮助您获得这些值。
答案 1 :(得分:1)
获取名称空间声明的标准方法来自startPrefixMapping事件: