2008-09-01 9 views
5

을 표시 나는 다음과 같은 작업을 수행하려는 우아한 방법을 찾을 수 없습니다로 채우기XML - 자원에서 읽기, 조작 및

  1. System.Xml.XmlDocument
  2. 에있는 XML 템플릿을 읽기를 내 UI에서 데이터는
  3. WebBrowser 제어에 적용 내가
  4. 를 작성했습니다 XSLT
  5. 가 렌더링 CSS 스타일 시트를 변환

현재 디스크의 파일에서 파일을 읽고 채우고 파일을 채운 다음 다시 디스크에 저장합니다. 템플릿의 XSLT을 참조하고 XSLTCSS을 입력 한 다음 WebBrowser.Navigate([filename]) 메서드를 사용하여 XML 파일을 표시합니다. 분명히

, 나는이 응용 프로그램을 배포하는 올 때,이 파일이 디스크에 존재하지 않으므로 끔찍하게 깰 수있을 거라, 나는 그들이 '로 XML 파일의 XSLTCSS 파일을 참조 할 수 없습니다 리소스가 될 것입니다. 템플릿을 리소스로 포함 시키려하지만 거기에서부터 진행할 수있는 깔끔한 방법을 찾을 수 없습니다.

도움이 많이 도움이되었습니다.

+0

http://stackoverflow.com/questions/851813/load-an-xml-from-resources?rq=1 – VMAtm

답변

1

빠른 질문. 왜 XML 템플릿이 필요합니까? 전에 스키마를 이미 알고 있다면 간단히 코드에서 전체 XML을 생성하십시오. 템플릿 파일을로드 할 필요가 없습니다.

0

Linq to XML을 확인하십시오. XML 기반 데이터를 작성하고 읽는 정말 좋은 방법입니다. System.Xml.XmlDocument 메커니즘보다 쉽습니다.

XSLT와 CSS를 제공한다고 가정 할 때 XHTML로 페이지를 작성하고 CSS를 인라인하는 것이 어떻겠습니까? 또는 XSLT 및 CSS 파일을 설치 프로그램의 컨텐츠로 추가하십시오.

컴파일 된 도움말은 실제로 설명하는 것과 비슷합니다. CHM 파일의 링크를 복사하고 일반 브라우저로 방문 할 수 있습니다. 사용 방법에 따라 디스플레이 리소스를 도움말 파일에 포함시킬 수 있다고 가정합니다.

1

키스 링크를 이용해 주셔서 감사 드리며, LINQ는 배울 점 목록에 있습니다. 불행히도,이 응용 프로그램에 대한 .Net 2.0을 대상으로해야하므로 LINQ가 문제가되지 않는다고 생각합니다.

이제 CSS를 XSLT의 머리글에 포함 시켰으며, System.Xml.Xsl.XslCompiledTransform 개체를 사용하여 XML을 메모리로 변환하는 방법을 발견했습니다. 현재 WebBrowser.DocumentText 속성을 사용하여 형식이 지정된 XML을 WebBrowser componenet에 전달하고 이것이 작동하는 것 같습니다.

나는 이것이 일을하는 가장 좋은 방법이 아니라고 생각할 수 없으므로 더 좋은 방법에 대한 의견을 보내 주시면 감사하겠습니다. 특히 LINQ를 사용하는 경우 바인드 할 스키마가 필요하며 전체 스키마가 있어야합니까? XML에 대해서는별로 좋지 않지만 템플릿을 사용하는 대신 스키마에서 곧바로 생성한다는 Vaibhav의 생각을 좋아합니다. 어디서부터 시작해야할지 모르겠다.

0

는 WebBrowser 컨트롤 및 하지 WPF를 사용하고 있기 때문에 반드시 단계이 주위 유일한 방법은로드 Resource Hacker 같은 도구를 사용하는 것입니다 4. 당신이 언급 CSS 파일을로드하기위한 디스크에 의존 " 관리되지 않는 "리소스를 사용하고 실제 Microsoft 1990 년대의 향수에 res : // 프로토콜 (http://msdn.microsoft.com/en-us/library/aa767740(VS.85).aspx)을 사용합니다.

데이터를 HTML 요소로 가져와야합니다.

void WireUpBrowserEvents() 
{ 

    HtmlElement table = this._browser.Document.GetElementById("UnitFormsTable"); 
    if (table != null) 
    { 
     HtmlElementCollection thead = table.GetElementsByTagName("thead"); 
     if ((thead != null) && (thead.Count == 1)) 
     { 
      HtmlElementCollection links = thead[0].GetElementsByTagName("a"); 
      if ((links != null) && (links.Count > 0)) 
      { 
       foreach (HtmlElement a in links) 
       { 
        a.Click += new HtmlElementEventHandler(XslSort_Click); 
       } 
      } 
     } 
    } 
} 

void XslSort_Click(object sender, HtmlElementEventArgs e) 
{ 
    e.ReturnValue = false; 

    if (this._xslSortWorker.IsBusy) return; 

    if (sender is HtmlElement) 
    { 
     HtmlElement a = sender as HtmlElement; 
     this._browser.Hide(); 
     this._browserMessage.Visible = true; 
     this._browserMessage.Refresh(); 
     this._xslSortWorker.RunWorkerAsync(a.Id); 
    } 
} 

이미는 HTMLElement와 HtmlElementCollection는 항상 System.Windows.Forms 네임 스페이스에 있음을 알고있을 수 있습니다 : 도움이 될 다음 코드 샘플 뭔가를 응답합니다. 이 말은 도움이되지 않을 수도 있지만 다음을 시도했습니다.