【问题标题】:Convert XML to Plain Text将 XML 转换为纯文本
【发布时间】:2010-11-06 05:51:32
【问题描述】:

我的目标是构建一个引擎,该引擎采用最新的 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());
        }
    }
}

【问题讨论】:

    标签: c# xml xslt hl7


    【解决方案1】:

    这将只留下文本:

    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】:

      或者你可以使用正则表达式:

      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】:

        你可以使用像 this 这样的东西,它使用 lynx 和 perl 来呈现 html,然后将其转换为纯文本?

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            【解决方案5】:

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

            此解决方案将比 ScottSEA 建议的仅使用 xml->xslt->text 更重量级,但如果您有任何更复杂的格式要求(例如缩进),它会变得更容易在 fo 中表达,而不是在 xslt 中模拟。

            我会避免使用正则表达式来提取文本。这太低级了,而且肯定很脆弱。如果只需要文本和 80 个字符行,默认的 xslt 模板将只打印元素文本。一旦你只有文本,你就可以应用任何必要的文本处理。

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2012-04-12
              • 2014-09-08
              • 2020-08-27
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-03-17
              相关资源
              最近更新 更多