2016-07-13 11 views
-1

ich eine HTML-Seite ansprechbar für eine mobile App zu schaffen, basierend auf folgende XML-Struktur:Linq to XML: Parsen unstrukturierter Elements

<?xml version="1.0" encoding="UTF-8"?> 
<Volumes> 
<paragraph> 
</paragraph> 
<paragraph> 
<text>Apple</text> 
    <page>1</page> 
<remark>(Apple Inc.) </remark> 
</paragraph> 
<paragraph> 
<explanation>Apple Inc. is an American multinational technology company headquartered in Cupertino, California, that designs, develops, and sells consumer electronics, computer software, and online services</explanation> 
</paragraph> 
<paragraph> 
<text>Dell</text> 
<remark>Dell Inc.</remark> 
</paragraph> 
<paragraph> 
<explanation>Dell Inc. is an American privately owned multinational computer technology company based in Round Rock, Texas, United States, that develops, sells, repairs, and supports computers and related products and services.</explanation> 
</paragraph> 
<paragraph> 
<text>Michael Dell</text> 
    <search>dell</search> 
<remark>born February 23, 1965</remark> 
</paragraph> 
<paragraph> 
<explanation> Michael Saul Dell (born February 23, 1965) is an American business magnate, investor, philanthropist, and author</explanation> 
</paragraph> 
<paragraph> 
<explanation> Business Career : </explanation> 
</paragraph> 
<paragraph> 
<explanation> While a freshman pre-med student at the University of Texas, Dell started an informal business putting together and selling upgrade kits for personal computers[11] in Room 2713 of the Dobie Center residential building. He then applied for a vendor license to bid on contracts for the State of Texas, winning bids by not having the overhead of a computer store</explanation> 
</paragraph> 
<paragraph> 
<text>HP</text> 
<remark>Hewlett-Packard</remark> 
</paragraph> 
<paragraph> 
<explanation>Something here</explanation> 
</paragraph> 
</Volumes> 

Grundsätzlich jedes Absatz Element wird eine neue Linie von Absatz erstellen. Und jedes Element innerhalb des Absatzes definiert das Textformat.

Absatz/Text definiert die Kopfzeile des Absatzes. Es sollte eine weitere Absatz/Erklärung Element folgen. Einige Erklärung möglicherweise in mehrere Absätze unterteilt.

Ich bin mir nicht sicher, wie man Parser schreibt, um diese Datei zu lesen.

z. Ausgabe enter image description here

PS: Ich kann auf die Formatierung achten. Brauchen nur Ideen, um das Dokument effizient zu parsen. Da jedes XML etwa 2-3 MB sein kann.

+3

Es ist nicht wirklich klar, was Sie suchen. Laden Sie das Dokument mit LINQ to XML ... nach welcher Struktur suchen Sie danach? Sie müssen sich über Ihre Anforderungen klar sein. –

+0

Ihr Problem besteht darin, dass Sie eine Struktur erstellen, die nicht einfach geparst werden kann. Denken Sie noch einmal über Ihre Struktur nach und entwickeln Sie eine Struktur, die leicht analysiert werden kann. – jdweng

+0

@jdweng, diese XML-Dateien sind bereits vorhanden und wurden aus PDF-Dateien migriert. Insgesamt 10 Dateien, die ein Buch und jedes Buch repräsentieren, können bis zu 100 Seiten umfassen. Der ursprüngliche Entwickler, der das PDF in XML migrierte, ging mit dem Code unter die Erde, um sie in einer HTML responsiven Seite darzustellen. (Was er demonstriert hat, könnte funktionieren). Neue Dateien werden in einem viel strukturierteren Schema konvertiert. Aber aufgrund der Zeitleiste muss ich mit diesen Dateien arbeiten. –

Antwort

1

Diese Antwort ist mehr wert als 1000 Punkte

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml; 
using System.Xml.Linq; 

namespace ConsoleApplication2 
{ 
    class Program 
    { 
     const string FILENAME = @"c:\temp\test.xml"; 
     static void Main(string[] args) 
     { 
      List<Topic> topics = new List<Topic>(); 
      XmlReader reader = XmlReader.Create(FILENAME); 
      Topic topic = null; 
      while (!reader.EOF) 
      { 
       if(reader.Name != "paragraph") 
       { 
        reader.ReadToFollowing("paragraph"); 
       } 
       if (!reader.EOF) 
       { 
        XElement paragraph = (XElement)XElement.ReadFrom(reader); 
        foreach(XElement subPara in paragraph.Elements()) 
        { 
         switch(subPara.Name.LocalName) 
         { 
          case "text" : 
           topic = new Topic(); 
           topics.Add(topic); 
           topic.title = (string)subPara; 
           break; 
          case "page": 
           topic.page = (int?)subPara; 
           break; 
          default: 
           KeyValuePair<string, string> newPara = new KeyValuePair<string, string>(
            subPara.Name.LocalName, 
            (string)subPara 
           ); 
           topic.paragraphs.Add(newPara); 
           break; 
         } 
        } 
       } 
      } 


     } 

    } 
    public class Topic 
    { 
     public string title { get; set; } 
     public int? page { get; set; } 
     public List<KeyValuePair<string, string>> paragraphs { get; set; } 
     public Topic() 
     { 
      paragraphs = new List<KeyValuePair<string, string>>(); 
     } 
    } 
} 
+0

das ist die perfekte Antwort und definitiv 1000 Punkte wert, aber leider habe ich nicht so viel Punktguthaben :) Nur zur Klarstellung, ich brauche das nur nicht zur Anzeige, da sind noch einige andere Funktionen nötig, die es erlauben zu suchen , füge Lesezeichen oder Notizen für jedes Thema hinzu. Aber ich kann mich darum kümmern. –