2014-10-08 85 views
4

所以我必須解析一個簡單的XML文件(只有一個級別,沒有屬性,只有元素和值),但問題是XML中存在(或可能存在)空格。我知道這很糟糕(可能很糟糕)的做法,但我不是那種構建XML的人,而是來自外部庫。使用元素名稱中的空格解析XML

例如:

<live key>test</live key> 
<not live>test</not live> 
<Test>hello</Test> 

現在我的策略是在同一時間讀取XML(我把它作爲一個字符串)一個字符,只是保存每個元素的名稱和值,因爲我得到對它來說,但這似乎有點太複雜。

有沒有更簡單的方法來做到這一點? XMLReader會引發錯誤,因爲它認爲XML是格式良好的,因此它認爲「活」是元素名稱,「鍵」是屬性,因此它試圖查找「=」並獲取「>」 。

+0

個人而言,我會嘗試刪除或替換所有空格,然後加載XML。但這也可能是棘手的。 – juharr 2014-10-08 15:57:24

+2

我會發送一封措辭強烈的信給誰管理這個庫 – Jonesopolis 2014-10-08 16:00:14

+1

不幸的是,空格使輸入不是一個格式良好的XML,這意味着沒有標準的解析器將採取這種;基本上,你是獨立的。這太可怕了 - 試着說服你的第三方圖書館的作家來解決這個問題。如果他們仍然在附近,他們應該明白爲什麼。 – dasblinkenlight 2014-10-08 16:00:56

回答

3

不幸的是,由庫返回的文本不是格式良好的XML,因此您不能使用XML解析器來解析它。標籤中的空間只是問題的一部分,還有其他問題,例如缺少「根」標籤。

幸運的是,單層語言足夠微不足道,無法與正則表達式匹配。基於正則表達式,「解析器」將是真正的XML一個可怕的選擇,但這種語言是不是真實的,所以你可以使用正則表達式至少作爲一種解決方法:

Regex rx = new Regex("<([^>\n]*)>(.*?)</(\\1)>"); 
var m = rx.Match(text); 
while (m.Success) { 
    Console.WriteLine("{0}='{1}'", m.Groups[1], m.Groups[2]); 
    m = m.NextMatch(); 
} 

這種做法背後的想法是找到字符串與「開放標籤」與斜槓匹配「結束標籤」。

這裏是一個demo,它產生以下輸出您的輸入:

live key='test' 
not live='test' 
Test='hello' 
+0

謝謝,這非常有幫助 – 2014-10-08 17:54:43

1

由於它是一個扁平的結構也許可以幫助:

MatchCollection ms = Regex.Matches(xml, @"\<([\w ]+?)\>(.*?)\<\/\1\>"); 

    foreach (Match m in ms) 
    { 
     Trace.WriteLine(string.Format("{0} - {1}", m.Groups[1].Value, m.Groups[2].Value)); 
    } 

所以,你得到的「鍵 - 值」對的列表。跟蹤僅用於檢查結果