【问题标题】:Error transforming XML转换 XML 时出错
【发布时间】:2011-07-19 17:40:40
【问题描述】:

我在解析 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。

我也遇到了这个:

A Bug

但这是一个相当古老的问题。 有人知道如何解决它吗?

谢谢!

[编辑: 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;

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

公共类 XMLTrimFilter 扩展 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; 
} 

}

【问题讨论】:

  • 如果没有更多信息,显而易见的地方是 XMLTrimFilter...你能发布它的源代码吗?是否删除了 NS 声明?

标签: java xml transformation


【解决方案1】:

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

  1. 输入 XML 未正确声明命名空间;即它是无效的 XML。

  2. 您的自定义 XMLTrimFilter 类中存在错误。


Sun 的错误是针对一个非常旧的 JAXP 版本,并且在很久以前就已修复。而且它和你的情况不太像……对我来说。


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

【讨论】:

  • 1 - 这绝对不是 XML 的结构问题,我已经多次使用这个 XML - 当我尝试转换它时,问题就出现了。 2 - 不,这不是我的实现,但我确信它可以正常工作。
  • @karla - 好吧,如果你不打算把它们展示给我们,我不认为你有机会得到一个好的答案。
  • 能否添加转换器引发此异常的 XML 文档?即使它在结构上是合理的,也可能存在命名空间问题。如果某些解析器不知道命名空间,它们可能会正确处理它。
  • XML 声明是可选的,不需要包含它。
【解决方案2】:

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

现在,您的异常说“前缀 SOAP-ENV 的命名空间尚未声明”。它没有说明“swp”。但是,异常报告中存在一些错误,将错误的前缀名称放入消息中,这并非不可能。

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

如果您可以手动为您的转换提供 XML 文档,我建议您发送它时不要使用“swp”前缀,或者简单地为其声明一些随机命名空间 URI。然后看看是否还会出现这种情况。也有可能应该使用swbepswp 是一个错误。 文档的结束标签也不见了,但我认为在将其粘贴到您的帖子中时它只是脱落了。

【讨论】:

  • 谢谢!听起来很合理 - 我很快就会尝试!
  • 我尝试了您的建议,但得到了相同的结果。我还尝试了非常基本的 xml - 例如 w3 - 什么都没有..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-22
  • 2020-02-27
  • 2013-05-23
  • 2015-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多