我需要操作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_toolbox
或addthis_button
类的第一个元素。
我非常有信心能找到具有正确类的元素,但我不能确信我可以添加这样的“复合”属性...特别是因为我甚至无法加载该东西到XmlDocument。
我错过了什么吗?有更好/更简单的方法吗?
由于
答案 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” 因为按钮计数是默认布局。