2009-06-26 4 views
2

저의 목표는 가장 최근의 HL7 3.0 CDA 문서를 가져와 근본적으로 다른 짐승 인 HL7 2.5와 역 호환되도록 만드는 것입니다.XML을 일반 텍스트로 변환

CDA 문서는 일치하는 XSL 파일과 짝을 지어 최종 사용자에게 표시하기에 적합한 HTML 문서를 렌더링하는 XML 파일입니다.

HL7 2.5에서는 마크 업이없는 렌더링 된 텍스트를 가져와 HL7 2.5 메시지를 채울 수있는 80 자 라인으로 쓸 수있는 텍스트 스트림 (또는 유사)으로 접어 넣어야합니다.

지금까지 XSLT를 사용하여 XML 문서를 변환하고 결과 HTML 문서를 생성하기 위해 XslCompiledTransform을 사용하는 방법을 사용했습니다.

내 다음 단계는 해당 문서를 가져 와서 (또는 이전 단계에서) HTML을 텍스트로 렌더링하는 것입니다. 나는 잠시 동안 수색했지만, 이것을 성취 할 방법을 알 수는 없다. 나는 그저 뭔가를 쉽게 바라보고있는 중이거나 그냥 마법의 검색어를 찾을 수 없습니다. 아무도 도움을 줄 수 있습니까?

FWIW, 나는 이것을 위해 RegEx를 사용하여 포옹하거나 권고하는 5 가지 또는 10 가지의 다른 질문을 읽었으며 그 길을 가고 싶지 않다고 생각합니다. 렌더링 된 텍스트가 필요합니다.

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>"; 
} 

답변

3

는 중간 HTML없이 당신에게 당신이 원하는 출력을 줄 것이다 XSL을 기록 고려 단계. 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; 
} 
1

또는 당신은 정규 표현식을 사용할 수 있습니다 :

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

당신이 this 같은 것을 사용할 수에 살쾡이와 펄을 사용하여 html을 렌더링 한 다음 일반 텍스트로 변환 하시겠습니까?

0

XSL의 경우 FO 및 FOP를 사용할 수있는 좋은 사례입니다. FOP은 PDF 출력뿐만 아니라 지원되는 다른 주요 출력 중 하나입니다. 원하는 사양 (예 : 선 너비)을 가진 간단한 xslt + fo 스타일 시트를 구성 할 수 있어야합니다.

이 솔루션은 ScottSEA가 제안한 것처럼 xml-> xslt-> text를 사용하는 것보다 약간 무겁습니다. 그러나 더 복잡한 서식 지정 요구 사항 (예 : 들여 쓰기)이 있으면 훨씬 쉽게 표현할 수 있습니다 fo, xslt에서 조롱하는 것보다.

텍스트 추출을위한 정규식을 피할 것입니다. 너무 낮은 수준이며 취성이 보장됩니다. 텍스트와 80 줄만 입력하면 기본 xslt 템플릿은 요소 텍스트 만 인쇄합니다. 일단 텍스트 만 있으면 필요한 텍스트 처리를 적용 할 수 있습니다.

덧붙여서, 나는 우리 제품의 일부로 CDAs를 생산하는 회사에서 근무하고 있습니다 (다이빙을위한 음성 인식). 3.0을 3.0으로 직접 변환하는 XSLT를 살펴 보겠습니다.두 버전간에 유지하고자하는 충실도에 따라, 실제로 달성하고자하는 것이 형식 간 변환 인 경우 전체 XSLT 경로가 가장 쉬운 방법 일 것입니다. 이것이 바로 XSLT가 구축 한 것입니다.