2011-07-08 77 views
0

解析XML時出現問題,實際上是在轉換它。轉換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; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.XMLReader; import 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; 
} 

}

+0

沒有更多的信息看明顯的地方是XMLTrimFilter ......您可以發佈它的來源?它是否刪除NS聲明? –

+0

肯定 - 它就在那裏... – karla

回答

1

我們沒有足夠的信息,但前兩件事情我會懷疑是:

  1. 輸入XML不正確地聲明名稱空間;即它是無效的XML。

  2. 您的自定義XMLTrimFilter類中存在一個錯誤。


的Sun錯誤是對一個真正的舊版本JAXP的,並在很久以前固定的。這與我的情況不太相似。


你粘貼缺少一個命名空間聲明,如果你試圖用驗證命名空間感知的XML解析器解析它會給出錯誤的XML。這可能是你的問題的原因,儘管錯誤信息看起來不正確。更可能的原因是您的自定義過濾器,IMO。

+0

1 - 這絕對不是XML結構的問題,我用這個XML多次 - 問題是當我試圖改變它。 2 - 不,不是我的實施,但我確定它確實工作正常。 – karla

+1

@karla - 如果你不打算向我們展示他們,我不喜歡你得到一個好答案的機會。 –

+0

更多信息 - 我試圖運行這個例子:http://www.jroller.com/santhosh/entry/xml_viewer_with_swing這一個:http://www.jroller.com/santhosh/entry/xml_viewer_with_swing_part – karla

0

在合適的編輯器中檢查XML之後,我注意到沒有爲前綴「swp」定義的名稱空間,它是元素addOwnRet所屬的名稱空間。對於SOAP使用目的而言,這是可能的(我對協議不太熟悉),但對於XSLT處理器,這僅僅是一個XML文檔,僅此而已。

現在,你的例外說:「名稱空間的前綴SOAP-ENV尚未聲明」。它沒有提到「swp」。但是,在例外報告中存在一些錯誤,在郵件中輸入錯誤的前綴名稱並不是不可能的。

它將使意義,其他處理不會失敗,因爲未聲明的命名空間前綴,使XML文檔無效,但不一定使非良好的。 XSLT處理器必須利用命名空間範圍來正確地確定輸入節點適合哪些模板,因此它需要前綴綁定的URI。

如果你可以手動提供一個XML文件到您的轉型,我建議通過發送它沒有說,「SWP」前綴,或者乾脆宣佈一些隨機命名空間URI它。然後看看這是否仍然發生。也有可能應該使用swbep,並且swp是錯誤的。 文檔的結束標記也不存在,但我認爲在將其粘貼到您的文章時,它會完全脫落。

+0

謝謝!聽起來很合理 - 我會很快嘗試! – karla

+0

我嘗試了你的建議,但我得到了同樣的結果。我也嘗試過非常基本的XML - W3的例子 - 沒有。 – karla