2009-06-26 4 views
2

Mein Ziel ist es, eine Engine zu erstellen, die die neuesten HL7 3.0 CDA-Dokumente nimmt und sie rückwärtskompatibel mit HL7 2.5 macht, was ein völlig anderes Biest ist.Konvertieren von XML in Plain Text

Das CDA-Dokument ist eine XML-Datei, die zusammen mit der entsprechenden XSL-Datei ein HTML-Dokument darstellt, das für die Anzeige an den Endbenutzer geeignet ist.

In HL7 2.5 Ich brauche den gerenderten Text, ohne Markup, und falten Sie es in einen Textstrom (oder ähnlich), die ich in 80 Zeichenzeilen schreiben kann, um die HL7 2.5 Nachricht zu füllen.

Bisher verwende ich einen Ansatz der Verwendung von XslCompiledTransform, um mein XML-Dokument mit XSLT zu transformieren und ein resultierendes HTML-Dokument zu erzeugen.

Mein nächster Schritt ist, das Dokument zu nehmen (oder vielleicht in einem Schritt davor) und den HTML-Code als Text zu rendern. Ich habe eine Weile gesucht, kann aber nicht herausfinden, wie ich das erreichen kann. Ich hoffe, dass es etwas Leichtes ist, dass ich einfach übersehe, oder einfach nicht die magischen Suchbegriffe finde. Kann mir jemand Hilfe anbieten?

FWIW, ich habe die 5 oder 10 anderen Fragen in SO gelesen, die mit RegEx umarmen oder mahnen, und denke nicht, dass ich diesen Weg gehen will. Ich brauche den gerenderten Text.

using System; 
using System.IO; 
using System.Xml; 
using System.Xml.Xsl; 
using System.Xml.XPath; 

public class TransformXML 
{ 

    public static void Main(string[] args) 
    { 
     try 
     { 

      string sourceDoc = "C:\\CDA_Doc.xml"; 
      string resultDoc = "C:\\Result.html"; 
      string xsltDoc = "C:\\CDA.xsl"; 

      XPathDocument myXPathDocument = new XPathDocument(sourceDoc); 
      XslCompiledTransform myXslTransform = new XslCompiledTransform(); 

      XmlTextWriter writer = new XmlTextWriter(resultDoc, null); 
      myXslTransform.Load(xsltDoc); 

      myXslTransform.Transform(myXPathDocument, null, writer); 

      writer.Close(); 

      StreamReader stream = new StreamReader (resultDoc); 

     } 

     catch (Exception e) 
     { 
      Console.WriteLine ("Exception: {0}", e.ToString()); 
     } 
    } 
} 

Antwort

3

Da Sie die XML-Quelle haben, sollten Sie eine XSL-Schreiben, dass Sie die Ausgabe, die Sie ohne den Zwischen HTML wollen geben Schritt. Es wäre weitaus zuverlässiger als der Versuch, HTML zu transformieren.

2

Dies wird Ihnen nur den Text verlassen:

class Program 
{ 
    static void Main(string[] args) 
    { 
     var blah = new System.IO.StringReader(sourceDoc); 
     var reader = System.Xml.XmlReader.Create(blah); 
     StringBuilder result = new StringBuilder(); 

     while (reader.Read()) 
     { 
      result.Append(reader.Value); 
     } 
     Console.WriteLine(result); 
    } 

    static string sourceDoc = "<html><body><p>this is a paragraph</p><p>another paragraph</p></body></html>"; 
} 
1

Oder Sie können einen regulären Ausdruck verwenden:

public static string StripHtml(String htmlText) 
{ 
    // replace all tags with spaces... 
    htmlText = Regex.Replace(htmlText, @"<(.|\n)*?>", " "); 

    // .. then eliminate all double spaces 
    while (htmlText.Contains(" ")) 
    { 
     htmlText = htmlText.Replace(" ", " "); 
    } 

    // clear out non-breaking spaces and & character code 
    htmlText = htmlText.Replace("&nbsp;", " "); 
    htmlText = htmlText.Replace("&amp;", "&"); 

    return htmlText; 
} 
0

Können Sie so etwas wie this verwenden, die Luchse und Perl verwendet, um Rendern Sie den HTML-Code und konvertieren Sie ihn dann in reinen Text?

0

Dies ist ein großer Anwendungsfall für XSL: FO und FOP. FOP ist nicht nur für die PDF-Ausgabe, eine der anderen wichtigen Ausgaben, die unterstützt wird, ist Text. Sie sollten in der Lage sein, ein einfaches xslt + fo-Stylesheet zu erstellen, das die gewünschten Spezifikationen (d. H. Linienbreite) aufweist.

Diese Lösung wird ein bisschen schwerer, dass nur xmls-> xslt-> Text wie ScottSEA vorgeschlagen, aber wenn Sie komplexere Formatierungsanforderungen (z. B. Einrücken) haben, wird es viel einfacher, in auszudrücken fo, als in xslt zu verspotten.

Ich würde vermeiden Regexs zum Extrahieren des Textes. Das ist zu niedrig und garantiert spröde. Wenn Sie nur Text und 80 Zeichenzeilen möchten, wird die Standardvorlage xslt nur Elementtext drucken. Sobald Sie nur den Text haben, können Sie die Textverarbeitung anwenden, die notwendig ist.

Ich arbeite übrigens für eine Firma, die CDAs als Teil unseres Produktes produziert (Spracherkennung für Dikationen). Ich würde in ein XSLT schauen, das das 3.0 direkt in 2.5 umwandelt.Abhängig von der Genauigkeit, die Sie zwischen den beiden Versionen beibehalten möchten, ist die vollständige XSLT-Route wahrscheinlich Ihre einfachste Wette, wenn Sie wirklich die Konvertierung zwischen den Formaten erreichen möchten. Dafür wurde XSLT entwickelt.