如果在SAX中设置setNamespaceAware(true),如何获取“xmlns:XXX”属性?

时间:2011-03-24 08:41:27

标签: java xml namespaces saxparser

这是我的代码:

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/">

我只获得nametargetNamespace属性。 xmlnsxmlns:wsdlxmlns:mimexmlns:httpxmlns:tns位于attributes参数中。但它们无法访问。

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

2 个答案:

答案 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)