замена тега xml значением html - PullRequest
4 голосов
/ 20 января 2010

Я работаю с c # .Net

У меня есть вопрос,

Я загружаю файл XML с XDocument.xDoc.Load(file), но это не удается, потому что в моем контенте также есть теги xml:

Пример: <root><abc><deg></abc></root>

Моя проблема в том, что функция Load обрабатывает <deg> как тег Xml без соответствующего "</deg>" ...

Мой вопрос: как я могу заменить "<" и ">" в "deg" на "&lt;" "&gt;" самым простым способом?

N.B. мой файл очень большой и у меня много тегов ...

Спасибо!

Ответы [ 4 ]

2 голосов
/ 20 января 2010

То, что вы пытаетесь сделать, сложно сделать со стандартными библиотеками .NET, если вы не хотите выполнять много трудного анализа. Если есть какие-то рифмы или причины для ваших нескончаемых тегов, это очень поможет. Например, есть ли известный список тегов, которые не закрыты? Если так, то поиск и замена не будут плохими.

Но, если он действительно открытый, если любой тег может быть закрыт, вам нужно будет использовать что-то вроде HTML Tidy . Оболочка .Net этого может быть найдена здесь . При таком решении тег <deg> будет преобразован в <deg/>. Оболочка HTML Tidy также может исправить некоторые другие проблемы, из-за которых xml будет неправильно сформирован .

Как только ваш файл содержит правильно сформированный xml, вы можете легко загрузить его в xml-объекты. Тогда, если у вас есть другая работа с документом, вы по крайней мере сможете увидеть в формате xml.

1 голос
/ 20 января 2010

Стандартный отказ от ответственности в regex здесь ... - иногда они могут пригодиться для сценариев очистки HTML .

Попробуйте этот подход:

string input = "<root><abc><deg><foo></abc><bar></root>";
string pattern = @"(<(?<tag>\w+)>)(?!.*?</\k<tag>>)";
string result = Regex.Replace(input, pattern,
                         match => HttpUtility.HtmlEncode(match.Value));
XDocument document = XDocument.Parse(result);
Console.WriteLine(document.ToString());

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

РЕДАКТИРОВАТЬ: пакет Agility Html является альтернативным вариантом для очистки любого уродливого содержимого. Если вам известен контент, вы можете зайти туда и заменить его действительными закрывающими тегами.

0 голосов
/ 20 января 2010

Если этот файл действительно большой, то вы должны использовать XmlReader вместо XmlDocument, и проблема с "не закрытыми тегами" не возникает.

http://msdn.microsoft.com/en-us/library/system.xml.xmlreader%28VS.80%29.aspx

Пример: Как выполнить потоковое чтение большого файла XML в C # 3.5

0 голосов
/ 20 января 2010

Если вы можете попасть в этот раздел до того, как загрузите его в XmlDocument, тогда вы можете использовать метод HttpUtility.HtmlEncode, чтобы экранировать сущность для вас.

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

...