2016-10-07 2 views
0

Ich habe viele Dateien ". Txt" Dateien, die üblichen Text und XML-Tags in der Datei hat. Die Datei ist sehr groß und die Anzahl der Dateien ist sehr hoch. Also ich möchte einfach xml ohne Text nehmen. Ich weiß, dass Tags von <body> beginnen und mit </body> enden. Ich brauche nur <body> und alle verschachtelten Tags in <body>Erhalten Sie nur Xml unter Textdatei

Beispiel Datei nehmen:

exampleTextexampleTextexampleTextexampleTextexampleTextexampleText 
exampleTextexampleTextexampleTextexampleTextexampleTextexampleText 
<body> 
... 
</body> 

exampleTextexampleTextexampleTextexampleTextexampleTextexampleText 
exampleTextexampleTextexampleTextexampleTextexampleTextexampleText 

exampleTextexampleTextexampleTextexampleTextexampleTextexampleText 
exampleTextexampleTextexampleTextexampleTextexampleTextexampleText 

exampleTextexampleTextexampleTextexampleTextexampleTextexampleText 
exampleTextexampleTextexampleTextexampleTextexampleTextexampleText 
<body> 
... 
</body> 

exampleTextexampleTextexampleTextexampleTextexampleTextexampleText 
exampleTextexampleTextexampleTextexampleTextexampleTextexampleText 

exampleTextexampleTextexampleTextexampleTextexampleTextexampleText 
exampleTextexampleTextexampleTextexampleTextexampleTextexampleText 
exampleTextexampleTextexampleTextexampleTextexampleTextexampleText 
exampleTextexampleTextexampleTextexampleTextexampleTextexampleText 
<body> 
... 
</body> 

exampleTextexampleTextexampleTextexampleTextexampleTextexampleText 
exampleTextexampleTextexampleTextexampleTextexampleTextexampleText 

exampleTextexampleTextexampleTextexampleTextexampleTextexampleText 
exampleTextexampleTextexampleTextexampleTextexampleTextexampleText 

Ich habe versucht XDocument doc = XDocument.Parse(str); zu verwenden, aber ich habe eine Ausnahme bekam:

Daten an Die Root-Ebene ist ungültig. Linie 1, Position 1.

+1

Da die gesamte Datei kein XML ist, können Sie sie nicht als XML analysieren. Sie müssen die Body-Tags manuell analysieren. – AlG

+0

@AlG durch Regex für bessere Leistung? – StepUp

+2

Kleiner Vorschlag, lesen Sie jede Zeile, wenn Sie Sie sind inTag, während inTag extrahieren Sie die XML, wenn Sie eine Tag ändern inTag = false treffen. –

Antwort

0

Versuchen Sie etwas wie Code unten. Es funktioniert, wenn alle Zeilen mit "<" beginnen. Wenn nicht, müssen wir möglicherweise Regex verwenden.

  StreamReader reader = new StreamReader(FILENAME, Encoding.UTF8); 
      string inputLine = ""; 
      string str = ""; 
      while ((inputLine = reader.ReadLine()) != null) 
      { 
       if (inputLine.Trim().StartsWith("<")) 
       { 
        str += inputLine + "\n"; 
       } 
      } 
+0

Was ist besser in der Leistung "Regex" oder "reader.ReadLine()"? – StepUp

+1

Definitiv ReadLine() ohne Frage. Regex verwendet viel Speicher. Beim Parsen von Regex wird eine Hierarchie von Teilstrings erstellt. – jdweng

0

Obwohl es nicht unbedingt eine gute Idee, die Sie dies als XML tatsächlich analysieren kann, indem es in einem einzigen Paar von Tags, wie lange Einwickeln, wie Sie sicher sind, dass es richtig abgegrenzt ist (dh < als < im nicht- XML-Inhalt usw.) - XML ​​erlaubt Ihnen, gemischten Inhalt innerhalb eines Elements zu haben, das eine Kombination von Daten und verschachtelten Elementen ist.

z.B. Folgendes gilt XML:

<FileContent> 
exampleTextexampleTextexampleTextexampleTextexampleTextexampleText 
exampleTextexampleTextexampleTextexampleTextexampleTextexampleText 
<body> 
... 
</body> 

exampleTextexampleTextexampleTextexampleTextexampleTextexampleText 
exampleTextexampleTextexampleTextexampleTextexampleTextexampleText 

exampleTextexampleTextexampleTextexampleTextexampleTextexampleText 
exampleTextexampleTextexampleTextexampleTextexampleTextexampleText 

exampleTextexampleTextexampleTextexampleTextexampleTextexampleText 
exampleTextexampleTextexampleTextexampleTextexampleTextexampleText 
<body> 
... 
</body> 

exampleTextexampleTextexampleTextexampleTextexampleTextexampleText 
exampleTextexampleTextexampleTextexampleTextexampleTextexampleText 

exampleTextexampleTextexampleTextexampleTextexampleTextexampleText 
exampleTextexampleTextexampleTextexampleTextexampleTextexampleText 
exampleTextexampleTextexampleTextexampleTextexampleTextexampleText 
exampleTextexampleTextexampleTextexampleTextexampleTextexampleText 
<body> 
... 
</body> 

exampleTextexampleTextexampleTextexampleTextexampleTextexampleText 
exampleTextexampleTextexampleTextexampleTextexampleTextexampleText 

exampleTextexampleTextexampleTextexampleTextexampleTextexampleText 
exampleTextexampleTextexampleTextexampleTextexampleTextexampleText 
</FileContent> 

Also, wenn Sie wickeln Sie es nur in einem Paar von Tags können Sie es laden. Sie können dann mit XPath auf die Körperelemente zugreifen.

z.B. etwas wie (ungetestet)

public string GetBodyTagContent (string fileContent) 
{ 
    var xmlDoc = new System.Xml.XmlDocument(); 
    xmlDoc.LoadXml("<FileContent>" + fileContent + "</FileContent>"); 
    return string.Join(",", (from n in xmlDoc.SelectNodes("//body") select n.InnerText)); 
} 
+0

Danke, aber ich kann nicht in ein einzelnes Paar von Tag wickeln – StepUp

0

html enthält Dateiinhalte.
resultList würde Liste der Körperinhalte geben

Kurze Erklärung - Es entspricht allen Text zwischen zwei Body-Tags. Die *? am Ende ist nicht-gierige oder Lazy-Quantifizierer und ermöglicht, mehrere Body-Tags anstelle von Text im ersten <body> und letzten -Tag übereinstimmen.

RegexOptions options = RegexOptions.IgnoreCase | RegexOptions.Singleline; 
Regex regx = new Regex("<body>(?<bodyContents>.*?)</body>", options); 
Match matchResult = regx.Match(html); 
List<string> resultList = new List<string>(); 
while (matchResult.Success) 
{ 
     var d = matchResult.Groups["bodyContents"].Value; 
     resultList.Add(d.Trim());   
     matchResult = matchResult.NextMatch(); 
} 

Die Regex arbeitet mit bestimmten Mustern (Text zwischen Body-Tags), jedoch wäre es fehl, wenn Körper hat Attribute oder HTML ist nicht richtig ausgebildet.

Verwandte Themen