누군가가이 문제를 해결할 수 있기를 바랍니다. 솔루션은 C#에 있어야합니다.C# XML에서 HTML 마크 업 사용
36MB 크기와 900k 라인의 xml 파일이 있습니다. 일부 노드에서이 같이 HTML 마크 업의 많은 나는이 파일을 청소하지만, 단 하나의 방법은 그러나, 작업을 수행 할 수있는 여러 가지 방법을 시도했습니다
<Obs><p>
<jantes -="" .="" 22.000="" apenas="" exclusive="" kms.="" leve="" liga="" o=""> </jantes></p>
같은 몇 가지 잘못된 마크 업을 가지고 이것은 웹 애플리케이션에서 실행되고 있습니다. 애플리케이션을 차단하고 작업을 완료하고 메모리에서 약 450MB를 소비하는 데 약 6 분이 걸립니다.
이 파일은 유효하지 않은 xml이므로 XmlTextReader를 사용할 수 없습니다. XLST를 사용하여 Strip HTML-like characters (not markup) from XML with XSLT?을 기반으로, 이상하게도 HTML 엔터티에 문제가 있습니다. 케빈의 제안에 따라
:
(일부 비틀기와 함께) 작업 과정은 http://www.codeproject.com/Articles/19652/HTML-Tag-Stripper
감사
편집에 다음과 같다. HTML 민첩성 팩을 사용하여 솔루션을 작성하려고합니다. 적어도 벤치 마크를 수행해야합니다. 그러나 나는 붙어 있어요.
<Obs><p> I WANT THIS TEXT<jantes -="" .="" 22.000="" apenas="" exclusive="" kms.="" leve="" liga="" o=""> </jantes></p></Obs>
어떻게 내가 태그 "OBS를"유지 "OBS"태그 안에 태그를 제거하고 또한 텍스트 "나는이 텍스트를 원하십니까"를 유지할 수 있습니다 : 다음 XML 노드를 상상? 기본적으로이 : 내가 작업을 완료 할 수 있었다 2
확인
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;
감사합니다 :)
편집 :
<Obs>I WANT THIS TEXT</Obs>
지금은이 내가 한 코드는 . 그러나 이것은 너무 많은 시간이 걸립니다. 약 3 시간이고 800MB의 메모리가 필요합니다.
아직 도움이 필요합니다.
다음은 코드입니다. 누군가 도움이 될 수 있습니다.
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 민첩성 팩을 좋아하지 않았어. 그것은 매우 강력합니다. 하지만 파일을 "정리"하는 데 4 시간이 걸렸습니다. ( – blindado