Конвертировать XML в обычный текст

2

Моя цель - создать движок, который использует новейшие 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());
        }
    }
}
Теги:
xslt
hl7

6 ответов

3
Лучший ответ

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

2

Это оставит вас только с текстом:

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

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

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

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

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

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

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

0

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

0

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

Как преобразовать HTML в текст в С#

Ещё вопросы

Сообщество Overcoder
Наверх
Меню