2010-04-16 6 views
1

Как заменить определенную часть в XML-файле на определенную строку?Заменить тег xml с помощью regex

<tag1></tag2> 
<tag2></tag2> 
...etc 
<soundcard num=0> 
<name>test123</name> 
</soundcard> 
<soundcard num=1> 
<name>test123</name> 
</soundcard> 
<soundcard num=2> 
<name>test123</name> 
</soundcard> 
<tag5></tag5> 

заменить все части звуковой карты, что результат выглядит так:

<tag1></tag2> 
<tag2></tag2> 
...etc 
{0} 
<tag5></tag5> 

Я использую C# .NET 3.5, и я thougt раствора регулярного выражения

+4

No * not * использовать регулярные выражения для синтаксического анализа, изменения или иного обращения к XML и другим нерегулярным языкам (например, HTML, JSON, YAML, ...). Правильное решение здесь - использовать XML API для анализа и изменения дерева документов, как вам нравится. – Joey

+0

@Johannes: Вы имеете в виду _Do_ нет. – SLaks

+1

[НЕ ИСПОЛЬЗУЙТЕ XML-ИСПОЛЬЗОВАНИЕ регулярных выражений] (http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags)! – SLaks

ответ

1

Мое предложение было бы использовать преобразование XSLT для замены тегов, которые вы хотите заменить известным тегом, скажем, и затем String.Replace ('', '{0}') ;.

Я повторяю, что сказал Йоханнес, не пытайтесь создавать RE для этого. По мере того как ваш XML становится более сложным, частота ошибок будет увеличиваться.

2

Лично я бы использовал Linq для XML и удалил сущности и заменил его текстовым узлом.

Обновление апреля 16/2010 4:40 вечера MST

Вот пример Linq для XML, я немного ржавый, но он должен по крайней мере дать вам представление о том, как это делается.

XElement root = XElement.Load("myxml.xml"); 

var soundcards = select el from root.Elements() where el.Name == "soundcard" select el; 
var prev_node = soundcards.First().PreviousNode; 

// Remove Nodes 
foreach(XElement card in soundcards) 
    card.Remove(); 

// Build your content here into a variable called newChild 

prev_node.AddAfterSelf(newChild); 
3

Если имеет быть регулярным выражением, файл XML хорошо сформирован, и вы знаете (скажем, от DTD), что <soundcard> тегов не может быть вложенными, то вы можете использовать

(<soundcard.*?</soundcard>\s*)+ 

и заменить все на {0}.

В C#:

resultString = Regex.Replace(subjectString, @"(<soundcard.*?</soundcard>\s*)+", "{0}", RegexOptions.Singleline); 

Для быстрого и грязного исправления к проблеме единовременной, я думаю, что это нормально. Неправильно думать о регулярном выражении как о правильном инструменте для обработки XML в целом.

Смежные вопросы