我在解析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。
我也遇到过这个问题:
但这是一个相当古老的问题。 有人知道如何解决它吗?
谢谢!
[编辑: 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;
public class 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;
}
}
答案 0 :(得分:1)
我们没有足够的信息,但我怀疑的前两件事是:
输入XML没有正确声明命名空间;即它是无效的XML。
您的自定义XMLTrimFilter
课程中存在错误。
Sun漏洞违反了JAXP的旧版本,很久以前就已经修复了。它与你的情况不太相似......对我而言。
您粘贴的XML缺少名称空间声明,如果您尝试使用验证名称空间感知XML解析器解析它,则会出错。这可能是您遇到问题的原因,但错误消息似乎不正确。更可能的原因是您的自定义过滤器,IMO。
答案 1 :(得分:0)
在合适的编辑器中检查XML之后,我注意到没有为前缀“swp”定义名称空间,即元素addOwnRet
所属的名称空间。对于SOAP使用目的,这是可能的(我对协议不是很熟悉),但对于XSLT处理器,这只是一个XML文档,仅此而已。
现在,您的异常表示“前缀 SOAP-ENV 的命名空间尚未声明”。它没有说“swp”。但是,异常报告中的一些错误并不是不可能的,它会在消息中添加错误的前缀名称。
其他处理不会失败是有道理的,因为未声明的命名空间前缀会使XML文档无效,但不一定会使其格式不正确。 XSLT处理器必须使用命名空间作用域来正确确定输入节点适合的模板,因此它需要前缀绑定的URI。
如果您可以手动为转换提供XML文档,我建议在没有“swp”前缀的情况下发送它,或者只是为它声明一些随机命名空间URI。然后看看这是否仍然存在。也可能应该使用swbep
而swp
是错误的。
该文档的结束标记也丢失了,但我认为在将其粘贴到您的帖子中时会掉下来。