2011-01-01 9 views
1

Ich versuche, eine Liste bestimmter Elemente in einem Word-Dokument mit dem OpenXML SDL 2.0 zu erstellen. Ich werde eine Vorlage öffnen und die Word-Vorlage für alle "w: sdt" -Elemente scannen, die ich als Liste der verfügbaren Dokumententeile verwenden werde. Ich werde diese Liste dem Benutzer anzeigen, damit sie die gewünschten Teile/Elemente auswählen können, um eine neue Version/Kopie des Dokuments aus dem Vorlagedokument zu erstellen.OpenXML SDK 2.0 XML-Teile und -Elemente auflisten

Also meine Liste muss die sequentielle Elementnummer (dies wird von den DocumentBuilder-Klassen verwendet) sowie die "w: alias" "val" oder vielleicht die "w: tag" "val", die sein wird wird verwendet, um die Auswahloption für den Benutzer anzuzeigen.

Sobald der Benutzer die verfügbaren Vorlagen-XML-Teile/-Elemente geprüft und ihre Auswahl getroffen hat, verwende ich DocumentBuilder, um die identifizierten Teile nach fortlaufender Nummer zu einem neuen Dokument hinzuzufügen.

Ich habe erfolgreich DocumentBuilder verwendet, um Dokumentelemente nach fortlaufender Nummer explizit zu identifizieren, um ein neues Dokument zu erstellen. Das funktioniert wunderbar.

Ich weiß, ich muss Rekursion verwenden, um durch das Vorlagedokument zu durchlaufen und die qualifizierten Elemente zu einer Liste hinzuzufügen. Ich bin einfach nicht clever genug mit C# oder dem OpenXML SDK, um die eleganteste Möglichkeit zu finden, durch das Template-Dokument zu scoren, das auf die gewünschten XML-Teile/-Elemente abzielt.

Kann mir jemand auf ein anwendbares Beispiel zum Aufzählen einer Liste von Teilen/Elementen in einem OpenXML-Dokument verweisen?

+0

... also recherchiere ich und ich denke, ich sollte einen SAX-ähnlichen Ansatz betrachten, der in Brian Jones & Zeyads Blogbeitrag "Parsen und Lesen großer Excel-Dateien mit dem Open XML SDK" vorgestellt wird. Dies ermöglicht die Verwendung eines OpenXMLReader zum Durchlaufen der XML-Teile oder -Elemente. Ich weiß noch nicht genau, wie ich das machen soll, aber es scheint der richtige Weg zu sein. –

Antwort

1

Wenn es keine Leistungsgründe gibt, können Sie das Dokument nicht mithilfe von OpenXmlSdk öffnen und LINQ-Abfragen ausführen, um jedes Ihrer SDT-Elemente zu finden?

Etwas entlang der Linien von:

using(WordProcessingDocument doc = WordProcessingDocument.Open(byte[], false);){ 

    IEnumerable<SdtContent> sdtElements = doc.MainDocumentPart.Body.Descendants<SdtContent>(); 
    foreach(SdtContent el in sdtElements){ 
     // Collect content tag name/alias 
     // Collect your sequential element number? 
    } 
} 

Ich habe diesen Ansatz vor und herausgefiltert externes Element verwendet, um eine Liste der SdtContent Elemente zu sammeln. Obwohl ich nicht sicher bin, was Sie mit sequentiellen Elementzahlen meinen?

+0

Damoe, großer Vorschlag. –

+0

Nach weiteren Recherchen konnte ich die Builder-Klassen verwenden, um Elemente wie Absätze und SDT-Blöcke zu greifen. Mit LINQ und dem OpenXML SDK 2.0 kann ich diese Elemente in IEnumerable-Objekten sammeln. –

+0

@damoe - Damoe, könnten Sie mir helfen mit dem folgenden: http: //stackoverflow.com/questions/15791732/openxml-sdk-having-borders-for-cell –

Verwandte Themen