5

这是我的代码:

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参数中的属性。attributespublic 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/">

我只是得到nametargetNamespace属性。xmlns, xmlns:wsdl, xmlns:mime,xmlns:httpxmlns:tnsattributes参数中。但它们不可访问。

有没有办法使用setNamespaceAware=true和获取节点的所有属性?

4

2 回答 2

8

当您的 XML 解析器支持 XML 命名空间时,您不需要访问这些属性,因为它们只定义了 XML 中使用的命名空间的短名称。

在这种情况下,您总是使用它们的全名(例如 )来引用名称空间http://schemas.xmlsoap.org/wsdl/,并且可以忽略它们在 XML 中的别名(例如wsdl)。

SAX 不提供这些值的事实记录在Attributes中:

它将 [...] 不包含用作命名空间声明 ( xmlns*) 的属性,除非该http://xml.org/sax/features/namespace-prefixes功能设置为truefalse默认情况下)。

因此,使用saxfac.setFeature("http://xml.org/sax/features/namespace-prefixes", true)应该可以帮助您获得这些值。

于 2011-03-24T09:04:10.127 回答
1

获取命名空间声明的标准方法是从 startPrefixMapping 事件:

于 2011-03-24T13:31:21.467 回答