2011-07-15 28 views
0

我需要操縱XML字符串。
的字符串是這個:LoadXML在屬性中使用「:」

<div class="addthis_toolbox addthis_default_style "> 
<a class="addthis_button_facebook_like" fb:like:layout="button_count"></a> 
<a class="addthis_button_tweet"></a> 
<a class="addthis_counter addthis_pill_style"></a> 
</div> 

我想我會把它轉換成XmlDocument的,但XmlDocument.LoadXml()拋出有關的錯誤「:」字符;這是因爲fb:like:layout屬性。

我需要做的是將addthis:url屬性添加到addthis_toolboxaddthis_button類的第一個元素。

我很有信心,我可以找到正確的類的元素,但我真的不相信,我可以添加一個「複合」屬性這樣的...尤其是因爲我甚至不能加載一個XmlDocument的東西。

我錯過了什麼嗎?有更好/更簡單的方法嗎?

謝謝

回答

4

提供的XML格式不正確,因此您無法使用XML解析器來操作它。

可以執行該文本的前處理,所以它成爲良好的XML,然後使用XML引擎操縱它作爲XML。

編輯

閱讀:RegEx match open tags except XHTML self-contained tags

,但可在正則表達式的情況下使用是最合適的,如果你輸入HTML的結構是有規律的,如:

您可以使用此正則表達式

(?x) 
(?<=<)[^>]* 
class="[^"]* 
\b(?:addthis_toolbox|addthis_button)\b 
[^"]*" 
[^>]* 

找到div class="addthis_toolbox addthis_default_style ",然後更換這個串,即:

string xml = @"<div class=""addthis_toolbox addthis_default_style ""> 
<a class=""addthis_button_facebook_like"" fb:like:layout=""button_count""></a> 
<a class=""addthis_button_tweet""></a> 
<a class=""addthis_counter addthis_pill_style""></a> 
</div> 
"; 

const string Pattern = @"(?xs) 
    (?<=<)([^>]* 
    class=""[^""]* 
    \b(?:addthis_toolbox|addthis_button)\b 
    [^""]*"") 
    [^>]* 
"; 

var result = Regex.Replace(xml, Pattern, "$0 addthis:url=\"value\""); 

結果:

<div class="addthis_toolbox addthis_default_style " addthis:url="value"> 
<a class="addthis_button_facebook_like" fb:like:layout="button_count"></a> 
<a class="addthis_button_tweet"></a> 
<a class="addthis_counter addthis_pill_style"></a> 
</div> 
+0

爲什麼它不合格? – thomasb

+0

@ cosmo0,XML名稱中不允許有多個冒號。 –

+0

好的......好吧,我無法改變這一點,這是AddThis給我的。那我能做些什麼? – thomasb

5

根據XML 1.0建議,XML格式良好,但根據XML命名空間1.0建議,它不是名稱空間良好的格式。所以如果你的XML解析器有一個禁用命名空間處理的開關,你應該能夠解析它。我不知道.net的XmlDocument解析器是否有這樣的開關。

+0

+1,確實!__ –

+0

謝謝,這是一個主角。 – thomasb