Я действительно надеюсь, что кто-то может помочь мне с этой проблемой. Решение должно быть на C#.C# Strip HTML Markup в XML
У меня есть xml-файл размером 36 МБ и с линиями 900 КБ. На некоторых узлах имеет много HTML-разметки и некоторые недопустимую разметку, как
<Obs><p>
<jantes -="" .="" 22.000="" apenas="" exclusive="" kms.="" leve="" liga="" o=""> </jantes></p>
Я пробовал различные способы очистки этого файла, но только один из способов может выполнить задачу, однако, как это выполняется в веб-приложении, оно блокирует приложение и занимает около 6 минут для завершения задачи и потребляет около 450 МБ в памяти.
Поскольку этот файл является недопустимым xml, я не могу использовать XmlTextReader. Использование XLST, основанный на Strip HTML-like characters (not markup) from XML with XSLT?, странно, я тоже с проблемами с HTML-сущностями.
Процесс, который работал (с некоторыми ухищрениями) является следующим по http://www.codeproject.com/Articles/19652/HTML-Tag-Stripper
Благодарности
Edit:
После предложения Кевина. Я пытаюсь создать решение с помощью пакета Agility Pack. По крайней мере, чтобы сделать некоторые тесты. Я застрял. Представьте себе следующий XML-узел:
<Obs><p> I WANT THIS TEXT<jantes -="" .="" 22.000="" apenas="" exclusive="" kms.="" leve="" liga="" o=""> </jantes></p></Obs>
Как я могу раздеться теги внутри «набл» тег, держать тег «набл», а также сохранить текст «Я хочу этот текст»? В основном это:
<Obs>I WANT THIS TEXT</Obs>
На данный момент это код я:
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(text);
Queue<HtmlNode> nodes = new Queue<HtmlNode>(doc.DocumentNode.SelectNodes("./*|./text()"));
while (nodes.Count > 0)
{
HtmlNode node = nodes.Dequeue();
HtmlNode parentNode = node.ParentNode;
HtmlNodeCollection childNodes = node.SelectNodes("./*|./text()");
if (childNodes != null)
{
foreach (HtmlNode child in childNodes)
{
if (child.Name != "obs")
{
nodes.Enqueue(child);
}
else
{
childNodes = child.SelectNodes("//p|//jantes");
foreach (HtmlNode nodeToStrip in childNodes)
nodeToStrip.ParentNode.RemoveChild(nodeToStrip);
}
}
}
}
string s = doc.DocumentNode.InnerHtml;
спасибо :)
EDIT 2
Хорошо, я был в состоянии выполнить поставленную задачу , Однако это занимает слишком много времени. Около 3 часов и потребляет 800 МБ в памяти.
По-прежнему нужна помощь!
Вот код, это может помочь кому-то.
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(text);
Queue<HtmlNode> nodes = new Queue<HtmlNode>(doc.DocumentNode.SelectNodes("./*|./text()"));
while (nodes.Count > 0)
{
HtmlNode node = nodes.Dequeue();
HtmlNode parentNode = node.ParentNode;
HtmlNodeCollection childNodes = node.SelectNodes("./*|./text()");
if (childNodes != null)
{
foreach (HtmlNode child in childNodes)
{
if (child.Name != "obs")
{
nodes.Enqueue(child);
}
else
{
childNodes = child.SelectNodes("//p|//jantes");
if (childNodes != null)
{
foreach (HtmlNode nodeToStrip in childNodes)
{
var replacement = doc.CreateTextNode(nodeToStrip.InnerText);
nodeToStrip.ParentNode.ReplaceChild(replacement, nodeToStrip);
}
}
}
}
}
}
string s = doc.DocumentNode.InnerHtml;
Не понравилось Html Agility Pack для этой цели. Это очень мощно. Но мне потребовалось 4 часа, чтобы «очистить» файл :( – blindado