如何使用WebBrowser控件显示XML?

时间:2011-03-01 16:47:49

标签: c# xml winforms

我的string包含xml。我想用它设置WebBrowser控件的值并显示为xml

我可以使用browser.DocumentText设置值,但是如何告诉它显示为XML?

8 个答案:

答案 0 :(得分:17)

为@PaoloFalabella建议的第一个解决方案提供一些代码(即将字符串内容写入临时xml文件并导航到它):

//create a random temporary file with an .xml file extension
var path = Path.GetTempPath();
var fileName = Guid.NewGuid().ToString() + ".xml";
var fullFileName = Path.Combine(path, fileName);
//write the contents of your xml string to the temporary file we just created
File.WriteAllText(fullFileName, xmlText); //xmlText is your xml string
//"navigate" to the file
webBrowser.Navigate(fullFileName); //webBrowser is your WebBrowser control

答案 1 :(得分:6)

这里有一个很好的链接:Displaying XML in the .NET WebBrowser Control

public XmlDocument DocumentXml
{
  set
  {
    Stream s = <defaultss.xsl from embedded resource file>

    XmlReader xr = XmlReader.Create(s);
    XslCompiledTransform xct = new XslCompiledTransform();
    xct.Load(xr);

    StringBuilder sb = new StringBuilder();
    XmlWriter xw = XmlWriter.Create(sb);
    xct.Transform(value, xw);

    this.DocumentText = sb.ToString();
  }
}

答案 2 :(得分:4)

不是特别容易但可能。您可以将字符串保存在xml文件中并使用Navigate()(yuck ...)将其加载回来,或者将xsl应用于xml(不开玩笑!),它会像IE浏览器一样呈现它。

请参阅:

http://social.msdn.microsoft.com/Forums/en/winforms/thread/18ca6734-ddb7-4f44-a77c-9a7713dcc2e1

答案 3 :(得分:3)

在这里,我提供了在WebBrowser控件中显示XML文件的分步解决方案。

  1. 在WinForm中添加WebBrowser控件。
  2. 在源文件夹中的某处找到defaultss.xsl。
  3. 并复制以下方法。

    private void DisplayXml()
    {
        string xmlString = "<Person><Name>Fawad</Name><Age>23</Age></Person>";
    
        // Load the xslt used by IE to render the xml
        XslCompiledTransform xTrans = new XslCompiledTransform();
        xTrans.Load(Path.Combine(new DirectoryInfo(Environment.CurrentDirectory).Parent.Parent.FullName, @"resources\defaultss.xsl"));
    
        // Read the xml string.
        StringReader sr = new StringReader(xmlString);
        XmlReader xReader = XmlReader.Create(sr);
    
        // Transform the XML data
        MemoryStream ms = new MemoryStream();
        xTrans.Transform(xReader, null, ms);
    
        ms.Position = 0;
    
        // Set to the document stream
        webBrowser1.DocumentStream = ms;
    }
    
  4. 我在这里复制“defaultss.xsl”的内容给那些在任何地方都找不到的人。只需将其放在记事本文件中,然后将其保存为文件夹“resources”中的xsl格式,或者将其命名为您想要的任何内容。

    <!--
     |
     | XSLT REC Compliant Version of IE5 Default Stylesheet
     |
     | Original version by Jonathan Marsh (jmarsh@xxxxxxxxxxxxx)
     | http://msdn.microsoft.com/xml/samples/defaultss/defaultss.xsl
     |
     | Conversion to XSLT 1.0 REC Syntax by Steve Muench (smuench@xxxxxxxxxx)
     |
     +-->
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
      <!-- Add doctype attributes to keep IE happy -->
      <xsl:output indent="no"
                    method="html"
                    doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN"
                    doctype-system="http://www.w3.org/tr/xhtml1/DTD/xhtml1-transitional.dtd" />
      <xsl:template match="/">
        <HTML>
          <HEAD>
            <SCRIPT>
              <xsl:comment>
                <![CDATA[
                      function f(e){
                         if (e.className=="ci") {
                           if (e.children(0).innerText.indexOf("\n")>0) fix(e,"cb");
                         }
                         if (e.className=="di") {
                           if (e.children(0).innerText.indexOf("\n")>0) fix(e,"db");
                         } e.id="";
                      }
                      function fix(e,cl){
                        e.className=cl;
                        e.style.display="block";
                        j=e.parentElement.children(0);
                        j.className="c";
                        k=j.children(0);
                        k.style.visibility="visible";
                        k.href="#";
                      }
                      function ch(e) {
                        mark=e.children(0).children(0);
                        if (mark.innerText=="+") {
                          mark.innerText="-";
                          for (var i=1;i<e.children.length;i++) {
                            e.children(i).style.display="block";
                          }
                        }
                        else if (mark.innerText=="-") {
                          mark.innerText="+";
                          for (var i=1;i<e.children.length;i++) {
                            e.children(i).style.display="none";
                          }
                        }
                      }
                      function ch2(e) {
                        mark=e.children(0).children(0);
                        contents=e.children(1);
                        if (mark.innerText=="+") {
                          mark.innerText="-";
                          if (contents.className=="db"||contents.className=="cb") {
                            contents.style.display="block";
                          }
                          else {
                            contents.style.display="inline";
                          }
                        }
                        else if (mark.innerText=="-") {
                          mark.innerText="+";
                          contents.style.display="none";
                        }
                      }
                      function cl() {
                        e=window.event.srcElement;
                        if (e.className!="c") {
                          e=e.parentElement;
                          if (e.className!="c") {
                            return;
                          }
                        }
                        e=e.parentElement;
                        if (e.className=="e") {
                          ch(e);
                        }
                        if (e.className=="k") {
                          ch2(e);
                        }
                      }
                      function ex(){}
                      function h(){window.status=" ";}
    
                      document.onclick=cl;
                  ]]>
              </xsl:comment>
            </SCRIPT>
            <STYLE>
              BODY {font:small 'Verdana'; margin-right:1.5em; margin-top: 44px;}
              .c  {cursor:hand}
              .b  {color:red; font-family:'Courier New'; font-weight:bold;
              text-decoration:none}
              .e  {margin-left:1em; text-indent:-1em; margin-right:1em}
              .k  {margin-left:1em; text-indent:-1em; margin-right:1em}
              .t  {color:#990000}
              .xt {color:#990099}
              .ns {color:red}
              .dt {color:green}
              .m  {color:blue}
              .tx {font-weight:bold}
              .db {text-indent:0px; margin-left:1em; margin-top:0px;
              margin-bottom:0px;padding-left:.3em;
              border-left:1px solid #CCCCCC; font:x-small Courier}
              .di {font:x-small Courier}
              .d  {color:blue}
              .pi {color:blue}
              .cb {text-indent:0px; margin-left:1em; margin-top:0px;
              margin-bottom:0px;padding-left:.3em; font:x-small Courier;
              color:#888888}
              .ci {font:x-small Courier; color:#888888}
              PRE {margin:0px; display:inline}
    
              .label {padding-left:20px; vertical-align: middle}
              .validation {color: white; padding: 3px; margin: 5px 5px 5px 5px; text-indent: 0}
              .summary {position: fixed; top: 0; left: 0; margin: 0px; padding-top: 10px; width: 100%; height: 32px; font-size: 12pt; vertical-align: middle;border-bottom: 2px solid black}
              .nav {float: right; padding-right:20px;}
              .failure {background: red;}
              .success {background: green;}
              .warning {background: yellow; color: black}
              .selected {font-weight: bold; text-indent: 1em}
            </STYLE>
          </HEAD>
          <BODY class="st">
            <xsl:apply-templates/>
          </BODY>
        </HTML>
      </xsl:template>
    
      <!-- Render the schema summary
             Include jquery from CDN and render a title bar across top -->
      <xsl:template match="processing-instruction('schemaSummary')">
        <script src="http://code.jquery.com/jquery-1.9.1.min.js"></script>
        <div id="schemaSummary" class="validation summary">
          <span class="label">
            <xsl:value-of select="." />
          </span>
          <span class="nav">
            <button id="prev">&lt;&lt;</button>
            <button id="next">>></button>
          </span>
        </div>
      </xsl:template>
    
      <!-- Handle the schemaValid processing instruction 
             This sets up a document.ready routine that 
             colour codes a visual queue i.e. a green title bar.
        -->
      <xsl:template match="processing-instruction('schemaValid')">
        <script>
          $(document).ready(function() {
          $("#schemaSummary").addClass("success")
          $("button").css("display", "none");
          });
        </script>
      </xsl:template>
    
      <!-- Handle the schemaInvalid processing instruction
             Renders a red title bar with navigation controls to
             step through the errors.    
         -->
      <xsl:template match="processing-instruction('schemaInvalid')">
        <script>
          <![CDATA[
                var index = -1;
                var errors = $("div.failure");
                var offsetFromTop = $("#schemaSummary").outerHeight();
                function nextError(){
                    if(index > -1) 
                        $(errors).eq(index).removeClass("selected");
                    index ++;
                    if(index >= $(errors).size())
                        index = 0;
    
                    $(errors).eq(index).addClass("selected");                                       
                    scrollTo($(errors).eq(index), offsetFromTop);
                }
                function prevError(){
                    $(errors).eq(index).removeClass("selected");
                    index --;
                    if(index < 0)
                        index = $(errors).size() - 1;
    
                    $(errors).eq(index).addClass("selected");                                       
                    scrollTo($(errors).eq(index), offsetFromTop);               
                }
                function scrollTo(element, offsetFromTop) {
                    $('html,body').animate({scrollTop: $(element).offset().top - offsetFromTop},'fast');
                }
    
                $(document).ready(function() {
                    $("#schemaSummary").addClass("warning");
                    $("#next").click(function() {
                        nextError();
                    });
                    $("#prev").click(function() {
                        prevError();
                    });
                });
                ]]>
        </script>
      </xsl:template>
    
      <!-- Add a colour coded bar in situ i.e. where the validation
             error has occured -->
      <xsl:template match="processing-instruction('error')">
        <div class="validation failure">
          <xsl:value-of select="."></xsl:value-of>
        </div>
      </xsl:template>
    
      <xsl:template match="processing-instruction()">
        <DIV class="e">
          <SPAN class="b">
            <xsl:call-template name="entity-ref">
              <xsl:with-param name="name">nbsp</xsl:with-param>
            </xsl:call-template>
          </SPAN>
          <SPAN class="m">
            <xsl:call-template name="entity-ref">
              <xsl:with-param name="name">lt</xsl:with-param>
            </xsl:call-template>?
          </SPAN>
          <SPAN class="pi">
            <xsl:value-of select="name(.)"/>
          </SPAN>
          <SPAN>
            <xsl:call-template name="entity-ref">
              <xsl:with-param name="name">nbsp</xsl:with-param>
            </xsl:call-template>
            <xsl:value-of select="."/>
          </SPAN>
          <SPAN class="m">
            <xsl:text>?></xsl:text>
          </SPAN>
        </DIV>
      </xsl:template>
      <xsl:template match="processing-instruction('xml')">
        <DIV class="e">
          <SPAN class="b">
            <xsl:call-template name="entity-ref">
              <xsl:with-param name="name">nbsp</xsl:with-param>
            </xsl:call-template>
          </SPAN>
          <SPAN class="m">
            <xsl:call-template name="entity-ref">
              <xsl:with-param name="name">lt</xsl:with-param>
            </xsl:call-template>?
          </SPAN>
          <SPAN class="pi">
            <xsl:text>xml </xsl:text>
            <xsl:for-each select="@*">
              <xsl:value-of select="name(.)"/>
              <xsl:text>="</xsl:text>
              <xsl:value-of select="."/>
              <xsl:text>" </xsl:text>
            </xsl:for-each>
          </SPAN>
          <SPAN class="m">
            <xsl:text>?></xsl:text>
          </SPAN>
        </DIV>
      </xsl:template>
      <xsl:template match="@*">
        <SPAN>
          <xsl:attribute name="class">
            <xsl:if test="xsl:*/@*">
              <xsl:text>x</xsl:text>
            </xsl:if>
            <xsl:text>t</xsl:text>
          </xsl:attribute>
          <xsl:value-of select="name(.)"/>
        </SPAN>
        <SPAN class="m">="</SPAN>
        <B>
          <xsl:value-of select="."/>
        </B>
        <SPAN class="m">"</SPAN>
      </xsl:template>
      <xsl:template match="text()">
        <DIV class="e">
          <SPAN class="b"> </SPAN>
          <SPAN class="tx">
            <xsl:value-of select="."/>
          </SPAN>
        </DIV>
      </xsl:template>
      <xsl:template match="comment()">
        <DIV class="k">
          <SPAN>
            <A STYLE="visibility:hidden" class="b" onclick="return false" onfocus="h()">-</A>
            <SPAN class="m">
              <xsl:call-template name="entity-ref">
                <xsl:with-param name="name">lt</xsl:with-param>
              </xsl:call-template>!--
            </SPAN>
          </SPAN>
          <SPAN class="ci" id="clean">
            <PRE>
              <xsl:value-of select="."/>
            </PRE>
          </SPAN>
          <SPAN class="b">
            <xsl:call-template name="entity-ref">
              <xsl:with-param name="name">nbsp</xsl:with-param>
            </xsl:call-template>
          </SPAN>
          <SPAN class="m">
            <xsl:text>--></xsl:text>
          </SPAN>
          <SCRIPT>f(clean);</SCRIPT>
        </DIV>
      </xsl:template>
      <xsl:template match="*">
        <DIV class="e">
          <DIV STYLE="margin-left:1em;text-indent:-2em">
            <SPAN class="b">
              <xsl:call-template name="entity-ref">
                <xsl:with-param name="name">nbsp</xsl:with-param>
              </xsl:call-template>
            </SPAN>
            <SPAN class="m">
              <xsl:call-template name="entity-ref">
                <xsl:with-param name="name">lt</xsl:with-param>
              </xsl:call-template>
            </SPAN>
            <SPAN>
              <xsl:attribute name="class">
                <xsl:if test="xsl:*">
                  <xsl:text>x</xsl:text>
                </xsl:if>
                <xsl:text>t</xsl:text>
              </xsl:attribute>
              <xsl:value-of select="name(.)"/>
              <xsl:if test="@*">
                <xsl:text> </xsl:text>
              </xsl:if>
            </SPAN>
            <xsl:apply-templates select="@*"/>
            <SPAN class="m">
              <xsl:text>/></xsl:text>
            </SPAN>
          </DIV>
        </DIV>
      </xsl:template>
      <xsl:template match="*[node()]">
        <DIV class="e">
          <DIV class="c">
            <A class="b" href="#" onclick="return false" onfocus="h()">-</A>
            <SPAN class="m">
              <xsl:call-template name="entity-ref">
                <xsl:with-param name="name">lt</xsl:with-param>
              </xsl:call-template>
            </SPAN>
            <SPAN>
              <xsl:attribute name="class">
                <xsl:if test="xsl:*">
                  <xsl:text>x</xsl:text>
                </xsl:if>
                <xsl:text>t</xsl:text>
              </xsl:attribute>
              <xsl:value-of select="name(.)"/>
              <xsl:if test="@*">
                <xsl:text> </xsl:text>
              </xsl:if>
            </SPAN>
            <xsl:apply-templates select="@*"/>
            <SPAN class="m">
              <xsl:text>></xsl:text>
            </SPAN>
          </DIV>
          <DIV>
            <xsl:apply-templates/>
            <DIV>
              <SPAN class="b">
                <xsl:call-template name="entity-ref">
                  <xsl:with-param name="name">nbsp</xsl:with-param>
                </xsl:call-template>
              </SPAN>
              <SPAN class="m">
                <xsl:call-template name="entity-ref">
                  <xsl:with-param name="name">lt</xsl:with-param>
                </xsl:call-template>?/
              </SPAN>
              <SPAN>
                <xsl:attribute name="class">
                  <xsl:if test="xsl:*">
                    <xsl:text>x</xsl:text>
                  </xsl:if>
                  <xsl:text>t</xsl:text>
                </xsl:attribute>
                <xsl:value-of select="name(.)"/>
              </SPAN>
              <SPAN class="m">
                <xsl:text>></xsl:text>
              </SPAN>
            </DIV>
          </DIV>
        </DIV>
      </xsl:template>
      <xsl:template match="*[text() and not (comment() or processing-instruction())]">
        <DIV class="e">
          <DIV STYLE="margin-left:1em;text-indent:-2em">
            <SPAN class="b">
              <xsl:call-template name="entity-ref">
                <xsl:with-param name="name">nbsp</xsl:with-param>
              </xsl:call-template>
            </SPAN>
            <SPAN class="m">
              <xsl:call-template name="entity-ref">
                <xsl:with-param name="name">lt</xsl:with-param>
              </xsl:call-template>
            </SPAN>
            <SPAN>
              <xsl:attribute name="class">
                <xsl:if test="xsl:*">
                  <xsl:text>x</xsl:text>
                </xsl:if>
                <xsl:text>t</xsl:text>
              </xsl:attribute>
              <xsl:value-of select="name(.)"/>
              <xsl:if test="@*">
                <xsl:text> </xsl:text>
              </xsl:if>
            </SPAN>
            <xsl:apply-templates select="@*"/>
            <SPAN class="m">
              <xsl:text>></xsl:text>
            </SPAN>
            <SPAN class="tx">
              <xsl:value-of select="."/>
            </SPAN>
            <SPAN class="m">
              <xsl:call-template name="entity-ref">
                <xsl:with-param name="name">lt</xsl:with-param>
              </xsl:call-template>/
            </SPAN>
            <SPAN>
              <xsl:attribute name="class">
                <xsl:if test="xsl:*">
                  <xsl:text>x</xsl:text>
                </xsl:if>
                <xsl:text>t</xsl:text>
              </xsl:attribute>
              <xsl:value-of select="name(.)"/>
            </SPAN>
            <SPAN class="m">
              <xsl:text>></xsl:text>
            </SPAN>
          </DIV>
        </DIV>
      </xsl:template>
      <xsl:template match="*[*]" priority="20">
        <DIV class="e">
          <DIV STYLE="margin-left:1em;text-indent:-2em" class="c">
            <A class="b" href="#" onclick="return false" onfocus="h()">-</A>
            <SPAN class="m">
              <xsl:call-template name="entity-ref">
                <xsl:with-param name="name">lt</xsl:with-param>
              </xsl:call-template>
            </SPAN>
            <SPAN>
              <xsl:attribute name="class">
                <xsl:if test="xsl:*">
                  <xsl:text>x</xsl:text>
                </xsl:if>
                <xsl:text>t</xsl:text>
              </xsl:attribute>
              <xsl:value-of select="name(.)"/>
              <xsl:if test="@*">
                <xsl:text> </xsl:text>
              </xsl:if>
            </SPAN>
            <xsl:apply-templates select="@*"/>
            <SPAN class="m">
              <xsl:text>></xsl:text>
            </SPAN>
          </DIV>
          <DIV>
            <xsl:apply-templates/>
            <DIV>
              <SPAN class="b">
                <xsl:call-template name="entity-ref">
                  <xsl:with-param name="name">nbsp</xsl:with-param>
                </xsl:call-template>
              </SPAN>
              <SPAN class="m">
                <xsl:call-template name="entity-ref">
                  <xsl:with-param name="name">lt</xsl:with-param>
                </xsl:call-template>/
              </SPAN>
              <SPAN>
                <xsl:attribute name="class">
                  <xsl:if test="xsl:*">
                    <xsl:text>x</xsl:text>
                  </xsl:if>
                  <xsl:text>t</xsl:text>
                </xsl:attribute>
                <xsl:value-of select="name(.)"/>
              </SPAN>
              <SPAN class="m">
                <xsl:text>></xsl:text>
              </SPAN>
            </DIV>
          </DIV>
        </DIV>
      </xsl:template>
    
      <xsl:template name="entity-ref">
        <xsl:param name="name"/>
        <xsl:text disable-output-escaping="yes">&amp;</xsl:text>
        <xsl:value-of select="$name"/>
        <xsl:text>;</xsl:text>
      </xsl:template>
    </xsl:stylesheet>
    

答案 4 :(得分:0)

var responseXml = "<ResponseXML> your xml string </ResponseXML>";    
var path = Path.Combine(Path.GetTempPath(), "Response.xml");    
var responseXmlDocument = new XmlDocument();
responseXmlDocument.LoadXml(responseXml);
responseXmlDocument.Save(path);
responseWebBrowser.Navigate(path);

答案 5 :(得分:0)

答案很简单。我们只需要像这样使用WebBrowser控件的DocumentText属性:

this.webBrowserControl.DocumentText = varWithXMLString;

我在控件的文档中找不到的一个细节是字符串必须满足以下要求:

  1. 它必须是格式正确的XML文档
  2. 必须包含XML Prolog:<?xml version="1.0"?>
  3. 必须验证XML字符串不包含 UTF-8 BOM字符(我进行此研究的原因)。通过C#字符串转换很难检测到这一点,因为它会生成一个不可打印的字符,该字符仅在将字符串强制转换为字节或int数组时才可见。

在下面的Github存储库中,我开发了一个示例来显示这些验证:https://github.com/batressc/WinFormsWebBrowserXML

在以下链接中,您可以详细查看示例的开发过程(西班牙语):http://batrianoworld.batressc.com/2018/07/22/visualizacion-de-xml-utilizando-control-webbrowser-de-windowsforms

答案 6 :(得分:0)

我可以使用C#将带有样式表的XML加载到Windows窗体浏览器控件中,如下所示。

string xmlFile = @".\sample1.xml";
string xslFile = @".\sample1.xsl";

XslCompiledTransform xslDocument = new XslCompiledTransform();
xslDocument.Load(xslFile);
StringWriter stringWriter = new StringWriter();
XmlWriter xmlWriter = new XmlTextWriter(stringWriter);
xslDocument.Transform(xmlFile, xmlWriter);
webDocumentView.DocumentText = stringWriter.ToString(); // webDocumentView is Web Browser Control- System.Windows.Forms.WebBrowser webDocumentView;

如果您在使用此代码时遇到任何麻烦,请发表评论。

答案 7 :(得分:-1)

您不需要保存临时文件,只需执行此操作...

browserControl.NavigateToString(xml);