2013-01-05 78 views
0

我使用一些asp.net/c#和其中一些我張貼,然後我得到一個repsonse(這應該是XML)從XML HTTP響應格式

不幸的是如果沒有正確格式化XML這樣的響應HP ILO腳本由於錯誤,使用XML解析器是不可能的。

下面是一個示例輸出:

IP Address is: 10.3.3.1 
<?xml version="1.0"?> 
<RIBCL VERSION="2.22"> 
    <RESPONSE 
     STATUS="0x0000" 
     MESSAGE='No error' 
    /> 
    <INFORM>Scripting utility should be updated to the latest version.</INFORM> 
</RIBCL> 
<?xml version="1.0"?> 
<RIBCL VERSION="2.22"> 
    <RESPONSE 
     STATUS="0x0000" 
     MESSAGE='No error' 
    /> 
</RIBCL> 
<GET_EMBEDDED_HEALTH_DATA> 
    <FANS> 
     <FAN>... 

,所以我關心的數據是內<GET_EMBEDDED_HEALTH_DATA>與XML解析器,如果我刪除不正確的語法,正常工作的所有。

我的問題是如何拉/只格式我需要的數據? 我知道我可以將不正確的XML響應保存到一個文本文件,格式化它,然後xml解析它,但有沒有更好/更快的方式做到這一點?

這樣做連續100次運行也需要很長時間。

+0

是無法修復問題在根?它看起來像有人忘記了調試信息 –

+0

是的,我想到了這一點,但唯一的辦法就是要求HP ILO devleopers爲我做到這一點,這是不會發生的。另一種方法是將XML解析爲文本並且處理字符串操作,但這太容易出錯。 –

回答

2

從上面顯示的內容來看,XML部分本身是格式良好的,但文本包含多個XML聲明和多個根。這些是唯一的問題還是其他地方存在真正的不良XML?

如果只有這些問題,這樣的事情可能工作:

string declarationsRemoved = output.Replace("<?xml version=\"1.0\"?>", ""); 

XmlDocument doc = new XmlDocument(); 
doc.LoadXml("<root>" + declarationsRemoved + "</root>"); 

XmlNode healthData = doc.SelectSingleNode("/root/GET_EMBEDDED_HEALTH_DATA"); 

或者,你可以只提取你需要使用正則表達式的一部分:

​​
+0

是的,多根是一個問題(運行多個腳本都會給自己的根目錄),但是你也有普通的文本,比如在repsonse開始時IP地址是:10.3.3.1',最後也是類似的東西。 –

+0

正則表達式也是一個好主意,但它似乎並沒有拿起''標籤,因爲它們從響應stirng中返回了轉義字符,例如'\ t \ r \ n \ t '。如何解釋 –

+0

只要你將它包裝在開始和結束標記中,'IP Address is:10.3.3.1'部分不應該成爲第一種方法的問題,正如我上面演示的那樣。如果額外文本包含<或&,那麼額外文本將成爲問題的唯一情況。 – JLRishe