2016-02-15 25 views
2

從公司收到一個XML文件,其中包含此元素,其URL值爲(由於包含非轉義&符而導致XML格式不正確):如何處理具有非法字符的XML

<BrowserFormPost> 
      <URL>https://example.com/asdsad?type=1&id2</URL> 
    </BrowserFormPost> 

他們不編碼&&amp;,這使得它不是XML。 現在的問題:我讓他們正確地編碼URL,但不幸的是,他們不能。他們購買了ERP軟件,他們只能提供這些數據。

現在在我的PHP我解析這個XML簡單的XML:

$returnUrl = mysqli_real_escape_string($conn,$xmlData->Request->PunchOutSetupRequest->BrowserFormPost->URL); 

,但現在我收到一個錯誤:

Warning: simplexml_load_string(): Entity: line 28: parser error : EntityRef: expecting ';' in

正如你已經猜到了,這發生在&字符。

所以現在我有2個問題:

  1. 我可以自己解析之前編碼在PHP中,這&&amp;

  2. 如何處理這種情況作爲公司中唯一的軟件開發人員。因爲我向其他公司的技術人員解釋這是不合法的XML,他說的唯一的事情就是他不能在他身邊更改XML,因爲那些也收到XML的公司現在不再工作了。我們公司希望這個項目能夠成功,因爲另一家公司對我們公司來說是一筆巨大的利潤。那麼如何處理來自其他公司的無效代碼呢?

UPDATE

我需要解決,因爲他們(其他公司)無法將其更改爲&的問題,所以我做了以下來解決這個問題:

$xmlFile = trim(file_get_contents('php://input')); 
$xmlDataEncoded = preg_replace('/&(?!#?[a-z0-9]+;)/', '&amp;', $xmlFile); 
$xmlData = simplexml_load_string($xmlDataEncoded); 
+1

「這很糟糕。」 - 這使得它「不是XML」 – Quentin

+0

根據定義,XML格式良好。 – Parfait

回答

2
  1. 是的,您可以將您收到的文本數據作爲文本(它不是XML)並使用手動或基於字符串的自動方法來替換&&amp;,注意不要在已被用作實體的地方替換它。這很醜陋,容易出錯,應該是不必要的。

  2. 你告訴任何關心公司沒有發送XML並迫使合作伙伴解決他們缺點的人。然後你的規模變得足夠大,以至於公司將修復他們破損的代碼或失去你作爲合作伙伴。如果這不可行,請參閱#1。

+1

我特別喜歡沒有。 2 – michi

+1

也許你的批評者試圖表達這樣的修復是醜陋的,容易出錯的,應該是不必要的。* – kjhughes

+0

1不太合適,因爲你必須擔心其他實體(例如「<」),包括那些儘管這種方法背後的想法確實可以在文件中定義。最終它可能需要正則表達式才能完全實現。除非出現像'&\w+;'這樣的模式,否則您會想要替換'&。 – Matthew