Конвертировать XML в обычный текст - PullRequest
2 голосов
/ 26 июня 2009

Моя цель - создать движок, который принимает последние документы CDA HL7 3.0 и делает их обратно совместимыми с HL7 2.5, который является радикально другим зверем.

Документ CDA представляет собой файл XML, который в паре с соответствующим ему файлом XSL отображает документ HTML, пригодный для отображения конечному пользователю.

В HL7 2.5 мне нужно получить отрендеренный текст без какой-либо разметки и сложить его в текстовый поток (или аналогичный), который я могу записать в 80 строк символов, чтобы заполнить сообщение HL7 2.5.

Пока что я использую XslCompiledTransform для преобразования моего XML-документа с использованием XSLT и создания результирующего HTML-документа.

Мой следующий шаг - взять этот документ (или, возможно, на шаг до этого) и отобразить HTML как текст. Я искал некоторое время, но не могу понять, как это сделать. Я надеюсь, что это легко, что я просто упускаю из виду или просто не могу найти волшебные поисковые термины. Кто-нибудь может предложить помощь?

FWIW, я прочитал 5 или 10 других вопросов в SO, которые охватывают или предостерегают, используя RegEx для этого, и не думаю, что я хочу идти по этому пути. Мне нужен отрендеренный текст.

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());
        }
    }
}

Ответы [ 6 ]

3 голосов
/ 27 июня 2009

Поскольку у вас есть источник XML, подумайте над написанием XSL, который даст вам желаемый результат без промежуточного шага HTML. Это было бы гораздо надежнее, чем пытаться преобразовать HTML.

2 голосов
/ 26 июня 2009

В результате у вас останется только текст:

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 голос
/ 27 июня 2009

Или вы можете использовать регулярное выражение:

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 голосов
/ 29 июня 2009

Это отличный пример использования XSL: FO и FOP. FOP не только для вывода PDF, один из основных поддерживаемых выводов - это текст. Вы должны быть в состоянии создать простую таблицу стилей xslt + fo, которая имеет требуемые спецификации (то есть ширину линии).

Это решение будет немного более тяжелым, чем просто использование xml-> xslt-> text, как предложено ScottSEA, но если у вас есть более сложные требования к форматированию (например, отступ), его будет намного проще выразить в fo , чем издеваться в xslt.

Я бы избегал регулярных выражений для извлечения текста. Это слишком низкий уровень и гарантированно будет хрупким. Если вам нужен только текст и 80 символов, шаблон xslt по умолчанию будет печатать только текст элемента. Если у вас есть только текст, вы можете применить любую необходимую текстовую обработку.

Кстати, я работаю в компании, которая производит CDA как часть нашего продукта (распознавание голоса для лекарств). Я хотел бы взглянуть на XSLT, который превращает 3.0 непосредственно в 2.5. В зависимости от точности, которую вы хотите сохранить между двумя версиями, полный маршрут XSLT, вероятно, будет вашим самым легким выбором, если вы действительно хотите достичь преобразования между форматами. Вот для чего был создан XSLT.

0 голосов
/ 27 июня 2009

Смотрите этот ответ на аналогичный вопрос по SO:

Как я могу конвертировать HTML в текст в C #

0 голосов
/ 27 июня 2009

Можете ли вы использовать что-то вроде this , которое использует lynx и perl для рендеринга HTML, а затем преобразовать его в обычный текст?

...