Ошибка преобразования XML - PullRequest
0 голосов
/ 08 июля 2011

У меня проблема с синтаксическим анализом xml, фактически с преобразованием.

Я получаю ошибку:

ERROR:  'Namespace for prefix 'SOAP-ENV' has not been declared.'
Jul 8, 2011 3:24:54 PM kumar.runs.start$2 run
SEVERE: null
javax.xml.transform.TransformerException: java.lang.RuntimeException: Namespace for prefix 'SOAP-ENV' has not been declared.
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:716)
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:313).........

Код, который я использую:

    SAXParserFactory saxFactory = SAXParserFactory.newInstance(); 
    SAXParser parser = saxFactory.newSAXParser(); 
    XMLReader reader = new XMLTrimFilter(parser.getXMLReader()); 

    TransformerFactory factory = TransformerFactory.newInstance(); 
    Transformer transformer = factory.newTransformer(); 
    transformer.setOutputProperty(OutputKeys.INDENT, "no"); 
    DOMResult result = new DOMResult(); 
    SAXSource ss = new SAXSource(reader, is);
    transformer.transform(ss, result); 
    return (Document)result.getNode(); 

XMLTrimFilter - это пользовательская реализация, расширяющая XMLFilterImpl.

Также я сталкивался с этим:

Ошибка

но это довольно старая проблема. У кого-нибудь есть идеи, как это исправить?

Спасибо!

[Edit: XML:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:enc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
    <SOAP-ENV:Header />
    <SOAP-ENV:Body>
            <swp:addOwnRet xmlns:swbep="urn:SWBEP">
                  <apples>33</apples>
                  <bucket>
                    <orange>5</orange>
                    <banana>5</banana>
                  </bucket>
            </swp:addOwnRet>
    </SOAP-ENV:Body>

]

Редактировать 2:

XMLTrimFilter:

package kumar.srcs;

import java.io.CharArrayWriter; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.XMLReader; import org.xml.sax.helpers.XMLFilterImpl;

открытый класс XMLTrimFilter extends XMLFilterImpl {

private CharArrayWriter contents = new CharArrayWriter(); 

public XMLTrimFilter(XMLReader parent){ 
    super(parent); 
} 
public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException{ 
    writeContents(); 
    super.startElement(uri, localName, qName, atts); 
}

public void characters(char ch[], int start, int length){ 
    contents.write(ch, start, length); 
} 

public void endElement(String uri, String localName, String qName) throws SAXException{ 
    writeContents(); 
    super.endElement(uri, localName, qName); 
} 

public void ignorableWhitespace(char ch[], int start, int length){} 

private void writeContents() throws SAXException{ 
    char ch[] = contents.toCharArray(); 
    if(!isWhiteSpace(ch)) 
        super.characters(ch, 0, ch.length); 
    contents.reset(); 
} 

private boolean isWhiteSpace(char ch[]){ 
    for(int i = 0; i<ch.length; i++){ 
        if(!Character.isWhitespace(ch[i])) 
            return false; 
    } 
    return true; 
} 

}

Ответы [ 2 ]

1 голос
/ 08 июля 2011

У нас недостаточно информации, но первые две вещи, которые я заподозрил бы:

  1. Входной XML неправильно объявляет пространство имен;т.е. это недопустимый XML.

  2. В вашем пользовательском XMLTrimFilter классе есть ошибка.


Ошибка Sunдействительно старая версия JAXP и была исправлена ​​давно.И это не очень похоже на ваш случай ... для меня.


В вставленном вами XML отсутствует объявление пространства имен, и он выдаст ошибки, если вы попытаетесь проанализировать его с помощью проверяющего пространства именПарсер XMLЭто может быть причиной ваших проблем, хотя сообщение об ошибке кажется неправильным.Более вероятная причина - ваш пользовательский фильтр, IMO.

0 голосов
/ 08 июля 2011

После проверки вашего XML в подходящем редакторе я заметил, что для префикса "swp" не определено пространство имен, под которым находится элемент addOwnRet.Вполне возможно, что для целей использования SOAP это нормально (я не очень знаком с протоколом), но для процессора XSLT это просто документ XML и ничего более.

Теперь, ваше исключение говорит "пространство имен"для префикса SOAP-ENV не объявлено ".Это ничего не говорит о "SWP".Но не исключено, что в отчете об исключении есть какая-то ошибка, которая приводит к неверному имени префикса в сообщении.

Было бы разумно, чтобы другая обработка не завершилась неудачей, поскольку необъявленный префикс пространства имен делает документ XML недействительным, но не обязательно делает его не правильно сформированным.Процессор XSLT должен использовать области пространства имен, чтобы правильно определить, к каким шаблонам подходит входной узел, поэтому ему необходим URI, к которому привязан префикс.

Если вы можете вручную предоставить документ XML для преобразования, япредложите отправить его без префикса "swp" или просто объявить для него какой-нибудь случайный URI пространства имен.Тогда посмотрите, если это все еще происходит.Также возможно, что следует использовать swbep, а swp - ошибка.Закрывающий тег для документа также отсутствует, но я предполагаю, что он просто отвалился при вставке в ваш пост.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...