Как получить атрибут "xmlns: XXX", если в SAX установлено setNamespaceAware (true)? - PullRequest
5 голосов
/ 24 марта 2011

Вот мой код:

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 и получить все атрибуты узла?

Ответы [ 2 ]

8 голосов
/ 24 марта 2011

Если ваш синтаксический анализатор XML поддерживает пространство имен XML, то вам не нужно требовать доступа к этим свойствам, поскольку они определяют только короткие имена для пространств имен, используемых в вашем XML.

В этомВ этом случае вы всегда ссылаетесь на пространства имен, используя их полное имя (например, http://schemas.xmlsoap.org/wsdl/), и можете игнорировать, какое короткое имя они используют в XML (например, wsdl).

Тот факт, что SAX не 'при условии, что эти значения задокументированы в Attributes классе :

Он не будет [...] содержать атрибуты, используемые в качестве объявлений пространства имен (xmlns*), если только *Функция 1016 * установлена ​​на true (по умолчанию false).

Поэтому использование saxfac.setFeature("http://xml.org/sax/features/namespace-prefixes", true) должно помочь вам получить эти значения.

1 голос
/ 24 марта 2011

Стандартным способом получения объявлений пространства имен является событие startPrefixMapping:

...