首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >转换XML时出错

转换XML时出错
EN

Stack Overflow用户
提问于 2011-07-08 20:31:46
回答 2查看 7.2K关注 0票数 0

我在解析xml,实际转换它时遇到了问题。

我得到的错误是:

代码语言:javascript
复制
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).........

我使用的代码是:

代码语言:javascript
复制
    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。

我还遇到了这样的情况:

A Bug

但这是一个相当古老的问题。有谁知道怎么解决这个问题吗?

谢谢!

[编辑: xml:

代码语言:javascript
复制
<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:

代码语言:javascript
复制
package kumar.srcs;

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

公共类XMLTrimFilter扩展了XMLFilterImpl{

代码语言:javascript
复制
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; 
} 

}

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-07-08 20:40:12

我们没有足够的信息,但我怀疑的前两件事是:

  1. 输入XML未正确声明命名空间;即它是无效的XML。
  2. 自定义XMLTrimFilter类中存在错误。

Sun的bug是针对JAXP的一个非常旧的版本的,并且很久以前就被修复了。和你的情况不太相似。对我来说。

您粘贴的XML缺少命名空间声明,如果您尝试使用支持命名空间验证的XML解析器对其进行解析,将会出现错误。这可能是问题的原因,尽管错误消息似乎不正确。更可能的原因是您的自定义过滤器,IMO。

票数 1
EN

Stack Overflow用户

发布于 2011-07-08 23:24:42

在适当的编辑器中检查您的XML之后,我注意到没有为前缀"swp“定义名称空间,元素addOwnRet所属的名称空间。出于SOAP使用的目的,这也有可能没问题(我对协议不是很熟悉),但是对于XSLT处理程序,这只是一个XML文档,仅此而已。

现在,您的异常显示为“尚未声明前缀SOAP-ENV的名称空间”。它没有提到"swp“。但在异常报告中有一些错误,在消息中放置了错误的前缀名称,这并不是不可能的。

其他处理不会失败是有意义的,因为未声明的名称空间前缀会使XML文档无效,但不一定会使其格式不正确。XSLT处理程序必须利用名称空间作用域来正确确定输入节点适合哪些模板,因此它需要前缀绑定到的URI。

如果可以手动为转换提供XML文档,我建议在发送时不使用"swp“前缀,或者简单地为其声明一些随机名称空间URI。然后看看这种情况是否还会发生。也有可能应该使用swbep,而swp是一个错误。文档的结束标记也丢失了,但我假设它只是在粘贴到您的帖子中时掉了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6624449

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档