LoadXML在属性中带有“:”

时间:2011-07-15 10:07:42

标签: c# .net xml xmldocument

我需要操作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>

我以为我会将其转换为XmlDocument,但XmlDocument.LoadXml()会抛出有关“:”字符的错误;这是因为fb:like:layout属性。

我需要做的是将addthis:url属性添加到带有addthis_toolboxaddthis_button类的第一个元素。

我非常有信心能找到具有正确类的元素,但我不能确信我可以添加这样的“复合”属性...特别是因为我甚至无法加载该东西到XmlDocument。

我错过了什么吗?有更好/更简单的方法吗?

由于

3 个答案:

答案 0 :(得分:5)

根据XML 1.0建议,XML格式正确,但根据XML Namespaces 1.0建议,它不是命名空间良好的。因此,如果XML解析器具有禁用命名空间处理的开关,则应该能够解析它。我不知道.net的XmlDocument解析器是否有这样的开关。

答案 1 :(得分: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>

答案 2 :(得分:1)

http://64.215.254.44/forum/viewtopic.php?f=5&t=26854

  

您实际上可以删除以下内容:fb:like:layout =“button_count”   因为按钮计数是默认布局。