将XML转换为纯文本

时间:2009-06-26 18:53:05

标签: c# xml xslt hl7

我的目标是构建一个引擎,该引擎采用最新的HL7 3.0 CDA文档,并使它们向后兼容HL7 2.5,这是一种截然不同的野兽。

CDA文档是一个XML文件,当与其匹配的XSL文件配对时,会呈现适合最终用户显示的HTML文档。

在HL7 2.5中,我需要获取渲染文本,没有任何标记,并将其折叠成文本流(或类似文件),我可以用80个字符行写出来填充HL7 2.5消息。

到目前为止,我采用的方法是使用XslCompiledTransform使用XSLT转换我的XML文档并生成结果HTML文档。

我的下一步是获取该文档(或者可能在此之前的一步)并将HTML呈现为文本。我已经搜索了一段时间,但无法弄清楚如何实现这一目标。我希望它只是简单的东西,我只是忽略,或者只是找不到神奇的搜索词。有人可以提供一些帮助吗?

FWIW,我已经阅读了SO中的5或10个其他问题,这些问题使用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 个答案:

答案 0 :(得分:3)

由于您拥有XML源代码,因此请考虑编写一个XSL,它将为您提供所需的输出,而无需中间HTML步骤。它比尝试转换HTML要可靠得多。

答案 1 :(得分: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>";
}

答案 2 :(得分: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;
}

答案 3 :(得分:0)

你可以使用this之类的东西,它使用lynx和perl来渲染html,然后将其转换为纯文本吗?

答案 4 :(得分:0)

在SO上看到关于类似问题的答案:

  

How can I Convert HTML to Text in C#

答案 5 :(得分:0)

这是XSL的一个很好的用例:FO和FOP。 FOP不仅适用于PDF输出,支持的其他主要输出之一是文本。你应该能够构造一个简单的xslt + fo样式表,它具有你想要的规格(即行宽)。

这个解决方案会比ScottSEA建议使用xml-&gt; xslt-&gt;文本更重一些,但如果您有更复杂的格式要求(例如缩进),表达式将变得更加容易在fo中,而不是在xslt中进行模拟。

我会避免使用正则表达式来提取文本。这太低了,保证脆弱。如果您只想要文本和80个字符行,则默认的xslt模板将仅打印元素文本。只有文本后,您可以应用任何必要的文本处理。

顺便说一下,我为一家生产CDA的公司工作,作为我们产品的一部分(用于治疗的语音识别)。我会研究一下将3.0直接转换为2.5的XSLT。根据您希望在两个版本之间保持的保真度,如果您真正想要实现的是格式之间的转换,那么完整的XSLT路线可能是您最容易的选择。这就是XSLT的目的。