LoadXML с ":" в атрибутах - PullRequest
       9

LoadXML с ":" в атрибутах

0 голосов
/ 15 июля 2011

Мне нужно манипулировать строкой 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.

IЯ довольно уверен, что смогу найти элемент с правильным классом, но я не совсем уверен, что могу добавить подобный «составной» атрибут ... тем более, что я даже не могу загрузить его в XmlDocument.

Я что-то пропустил?Есть ли лучший / более простой способ?

Спасибо

Ответы [ 3 ]

5 голосов
/ 15 июля 2011

XML правильно сформирован в соответствии с рекомендацией XML 1.0, но он не правильно сформирован в соответствии с рекомендацией XML Namespaces 1.0.Таким образом, вы сможете проанализировать его, если у вашего XML-анализатора есть переключатель для отключения обработки пространства имен.Я понятия не имею, есть ли у переключателя .net XmlDocument такой переключатель.

4 голосов
/ 15 июля 2011

При условии, что XML не правильно сформирован, поэтому вы не можете манипулировать им с помощью анализатора XML.

Вы можете выполнить предварительную обработку этого текста, чтобы он стал правильно сформированным XML, а затем манипулировать им как XML с помощью механизма XML.

EDIT :

Чтение: RegEx соответствует открытым тэгам, за исключением автономных тэгов XHTML

Но может быть, в вашем случае использование регулярных выражений наиболее целесообразно, если структура входного 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>
1 голос
/ 15 июля 2011

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

Вы можете удалить следующее: fb: like: layout = "button_count" поскольку счетчик кнопок является макетом по умолчанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...