2012-08-06 50 views
2

您能幫我解析xml,嵌套<?xml version="1.0" encoding="utf-8"?>標籤。當我試圖解析這個XML,我得到解析錯誤。使用嵌套xml開始標籤解析XML <?xml ...?> in java

<?xml version="1.0" encoding="utf-8"?>  
<soap> 
      <soapenvBody> 
       <serviceResponse> 
        <?xml version="1.0" encoding="UTF-8"?> 
        <data> 
         <respCode>0</respCode> 
        </data> 
       </serviceResponse> 
      </soapenvBody> 
     </soap> 
+0

這是沒有有效的XML。 – 2012-08-06 07:18:56

+2

有沒有簡單的方法來解析,因爲這是無效的XML。但是看到它是一種肥皂反應,它讓我想知道提供給您的是什麼樣的服務,看看他們是否可以修復服務(或者如果您有權訪問的話可以修復服務)不是更好嗎? – 2012-08-06 07:19:28

+0

您可以嘗試預處理流,刪除無效部分(例如,使用正則表達式替換),然後使用常規XML解析器解析它。我也認爲你可以使用SAX解析器解析它。 – rmaruszewski 2012-08-06 07:21:17

回答

0

以類似<?開頭的標籤是一個處理指令。 <?xml...>是一個XML聲明,只能出現在xml內容的開頭。它在XML體中是不允許的。

爲什麼你的肥皂身體包含這個?你有選擇刪除它嗎?

+0

回覆。我不能控制我接收的xml。所以我預處理了XML然後解析它。 – 2012-08-12 07:47:44

2

我不認爲這是一個真正的Java問題。在XML主體中有第二個XML聲明是非法的,所以我認爲你不能得到任何XML解析器來解析它。如果你有過XML控制(它看起來像你生成它來存儲的響應),那麼你可以嘗試用CDATA包裹內的XML文檔:

<?xml version="1.0" encoding="utf-8"?>  
<soap> 
    <soapenvBody> 
     <serviceResponse> 
      <![CDATA[ 
       <?xml version="1.0" encoding="UTF-8"?> 
       <data> 
        <respCode>0</respCode> 
       </data> 
      ]]> 
     </serviceResponse> 
    </soapenvBody> 
</soap> 

編輯:

我在想,你很可能不希望在這個響應裏面額外的XML聲明。你是否可以控制創建響應的代碼?我的猜測是,將XML片段<data>...</data>創建爲單獨的DOM對象,然後將字符串拼接在響應的中間。寫出整個XML文檔對象會導致包含XML聲明,但如果您只抓取文檔根節點對象<data>)並將其寫入爲字符串,那麼它可能不會包含額外的XML聲明那會給你帶來麻煩。

+0

感謝您的回覆。實際上我沒有控制xlm響應,我知道它不是有效的xml。所以我選擇了xml預處理選項並選擇了內部xml,然後使用SAX parse解析它並能夠檢索我想要的數據:)。再次感謝。 – 2012-08-12 07:45:59

+0

今天下午我做了一些工作後,我想到了一個新的解決方案,但由於這與我的評論完全無關,所以我決定將它作爲一個單獨的答案發布。 – DaoWen 2012-08-14 14:28:46

0

我沒有在java中找到任何解析器來解析這樣的嵌入式xml,因爲它不是一個有效的xml,我想幾乎所有的解析在分析它之前驗證xml。所以我選擇預處理xml選項並選擇內部xml然後使用SAX解析器我解析了xml並從xml中檢索了值。夥計們感謝你的回覆。

+1

自你原來的文章已經過去了一個星期,所以你可能已經從這裏開始了 - 但如果你仍然對分析沒有預處理感興趣,你應該看看我關於使用Jsoup的新答案。 – DaoWen 2012-08-15 03:10:58

2

我想到一個用於處理HTML的解析器可能能夠做你想做的。由於與嚴格的XML相比,HTML往往是一團糟,因此HTML解析器通常具有更高的容錯性。快速搜索出現了jsoup。我能夠從你的示例XML拉respCode上面大致是這樣的代碼:

import org.jsoup.Jsoup; 
import org.jsoup.nodes.Document; 

String data = "your xml goes here"; 
Document doc = Jsoup.parse(data); 
String respCodeRaw = doc.select("respCode").first().text(); 
int respCode = Integer.valueOf(respCodeRaw); 

(!我實際測試庫在Clojure的REPL,但上面的代碼應該工作)

+0

非常感謝您的幫助。我會嘗試這個選項。 – 2012-08-15 12:28:31