2013-01-11 112 views
2

我正在使用Play 1.2.4,我需要調用第三方Web服務。當我得到迴應時,我無法通過XPath正確解析它,因爲它包含無效的XML格式。Web服務響應中的XML格式無效

響應有&gt;&lt;而不是<>。我試圖解碼沒有運氣的反應。我也檢查了響應內容,看起來很好「application/soap + xml」。

那麼我該如何替換這個字符。有沒有一個優雅的方式來替換/轉換這個比簡單的字符串替換函數使用正則表達式。

編輯:這裏有一個更好的主意是我如何調用Web服務。

HttpResponse response = WS.url(WS_URL) 
       .setHeader("Content-Type","application/soap+xml") 
       .body(wsBody) 
       .post(); 

這是我做解析:

org.w3.dom.Document xmlDoc = response.getXML(); 
String textOfSelectedTag = XPath.selectText("tag", xmlDoc); 

和XPath找不到標籤,因爲它不是在格式像<tag>它就像&lt;tag&gt;

+2

請說明您是如何調用Web服務的。這聽起來像*東西*正在逃避XML ... –

+2

'字符串替換'!!!!!!!!!!! **大NO **! –

+0

@JonSkeet我用代碼示例編輯了文本。感謝您的關注。 – huzeyfe

回答

1

我猜你的XML具有良好的根元素!否則xmlDoc = response.getXML();應該有錯誤!我認爲XML中有很少或很多元素都是這樣的!如果我沒有錯,就是Web服務上的XML生成器負責生成這樣的文件!這不是因爲你閱讀的方式!

在這種情況下,我們不能爲我們做任何事情!我碰到過其他成員遇到不正確編碼的XML的情況。我一直在建議的這種情況是去修改生成這樣的XML的代碼(如果你有權訪問,那就是incase)否則......我們將留下的所有東西都是正則表達式或字符串操作!這雖然不是首選,但只有可用的方法。

我看到的這種XML代碼的一個原因是,由於使用了字符串連接!所以我的第一個建議是修改生成XML的源代碼。

更換&lt;<&gt;>正則表達式:

string result = Regex.Replace(Regex.Replace(input, @"(\&lt;)", @"<"), @"(\&gt;)", @">"); 
+1

感謝您的回答。所以我們正處在BIG NO TO字符串替換:) – huzeyfe

+1

雅這是最後一個,但至少選擇..好吧。仍然在尋找替代品;) –

+1

沒有XML DOM方法會在XML文檔中添加「<」或「>」(除CDATA外)。如果我正確猜測,有一些字符串處理技術正在被用來添加使用innerXML屬性或其他東西的元素..這是添加節點的最懶惰的方法。我強烈建議擺脫這樣的代碼!這不好!不是生產環境atleast :) –

2

好了,看起來這只是它返回一個字符串一個 SOAP方法 - 與字符串恰好是XML。

因此,您應該將<GetFooResult>(或其他)標記的內容作爲字符串獲取,然後將其解析爲XML文檔。當你得到它作爲一個字符串,它會解碼&lt;<等,所以它將是一個有效的文件。 然後你必須用TAG1根元素的文檔,然後您可以查詢等

我會建議你使用Web服務庫來進行調用,但 - 它應該能夠抽象出來一切都那麼你可以打電話getFoo()或其他任何獲得結果字符串,然後解析它,如你所期望的。

+0

喬恩,非常感謝你的幫助。 WS是PlayFramework中的Web服務庫。我想你建議另一個圖書館。無論如何,我正在使用這個庫的其他第三方Web服務沒有任何問題,但據我瞭解,這裏的問題是Web服務設計不好。所以你的第一個建議 - 標記和重新分析 - 是有道理的,我會選擇這個選項。 – huzeyfe

+1

@huzeyfe:但你只是得到一個HTTP響應。你想要知道關於SOAP的東西。從您發佈的代碼片段中,它看起來就像是一個HTTP庫。我不認爲Web服務本身看起來設計得很差 - 從Web服務調用中返回XML作爲字符串是合理的。 –

+0

我明白你的意思了。如果有幫助,讓我試試不同的圖書館。我真的很感激你的好意。 – huzeyfe