Ich glaube, Sie brauchen eine Vorbearbeitung von Zeichen einige HTML-Parser wie jsoup oder Baumstruktur-Algorithmus.
Es ist eine Option, um diesen Fall mit Jsoup-Bibliothek zu machen.
1. Java-Version
Zuerst Wortliste aus den HTML-Tags vorzubereiten.
Dann durchlaufen Sie den HTML-Inhalt mit Jsoups NodeVisitor-Klasse.
doc.body().traverse(
new NodeVisitor(){
@Override
public void head(Node arg0, int arg1) {
if(arg1 == 1)
{
String value = arg0.outerHtml();
if(!wordList.contains(value))
wordList.add(arg0.outerHtml());
}
}
@Override
public void tail(Node arg0, int arg1) {
}
}
);
Schließlich ist der Code wie folgt.
import java.util.ArrayList;
import java.util.List;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.nodes.Node;
import org.jsoup.select.Elements;
import org.jsoup.select.NodeVisitor;
public class HtmlTest {
public static String parseHtml(String str) {
org.jsoup.nodes.Document doc = Jsoup.parse(str);
final List<String> wordList = new ArrayList<String>();
doc.body().traverse(
new NodeVisitor(){
@Override
public void head(Node arg0, int arg1) {
if(arg1 == 1)
{
//String value = Jsoup.parse(arg0.outerHtml()).text();
String value = arg0.outerHtml();
if(!wordList.contains(value))
wordList.add(arg0.outerHtml());
}
}
@Override
public void tail(Node arg0, int arg1) {
}
}
);
for(String word: wordList)
{
System.out.println(word);
}
return "";
}
public static void main(String[] args)
{
System.out.println(parseHtml("We are <b><i>very</i></b><b>a</b>mused!\nThank you."));
}
}
Der Ausgang muss aussehen wie seine
We are
<b><i>very</i></b>
<b>a</b>
mused! Thank you.
2. C# Version
Nun, Der Quellcode von C# Version ist ein litte bisschen anders aber die gleiche Prozess (mit ein wenig Änderung benötigt).
Dies ist meine NodeVisitor-Version des Codes.
Zuerst analysieren Sie den HTML-Inhalt.
Document doc = NSoupClient.Parse(str);
Zweitens, wählen Sie den ursprünglichen Satz aus 'Körper' Tag.
doc.Select("body").Traverse(new TestNodeVisitor(wordList));
Der vollständige Code wie folgt.
using NSoup;
using NSoup.Nodes;
using NSoup.Select;
using System;
using System.Collections.Generic;
using System.IO;
namespace NSoupTest
{
class Program
{
private class TestNodeVisitor : NodeVisitor
{
List<String> wordList;
public TestNodeVisitor(List<String> wordList)
{
this.wordList = wordList;
}
public void Head(Node node, int depth)
{
if(depth == 1)
{
String value = node.OuterHtml();
if(!wordList.Contains(value))
wordList.Add(value);
}
}
public void Tail(Node node, int depth)
{
}
}
public static String parseHtml(String str) {
Document doc = NSoupClient.Parse(str);
List<String> wordList
= new List<String>();
doc.Select("body").Traverse(new TestNodeVisitor(wordList));
foreach (String word in wordList)
{
Console.WriteLine(word);
}
return "";
}
static void Main(string[] args)
{
try
{
parseHtml("We are <b><i>very</i></b><b>a</b>mused!\nThank you.");
}
catch (FileNotFoundException fe) {
Console.WriteLine(fe.Message);
}
}
}
}
Die Ausgabe sollte auch seine
We are
<b><i>very</i></b>
<b>a</b>
mused! Thank you.
Sie die NSoup Bibliothek, die ich zu diesem Zeitpunkt verwendet finden (eigentlich keine offizielle Version 0.8.0) von den site.
Die offizielle NSoup-Site ist here, aber keine Besucherschnittstelle.
Dann können Sie Ihre eigene Methode verwenden, um Code abzuschließen.
Ich muss Ihnen sagen, dies ist nur eine Option für Ihr Ziel.
Regard,
scheint wie eine sehr praktische Situation der Definition eines Parsers. Die Regeln müssen dafür in erster Linie klar sein. Wenn Sie es basierend auf einem Leerzeichen "" "trennen, erscheinen die Tags in einer einzigen Kette für mich. Dann muss '<' ein passendes '>' finden, um den Teilstring in die endgültige Liste zu ziehen. Dann '' '' '' und das '\ nT' benötigt erneut eine spezielle Handhabung. – nullpointer