2011-07-05 73 views
8

我的winform應用程序與Web服務進行通信。對於某些需求,我需要在Winform應用程序中以XML格式呈現Web服務響應。如何以XML方式在winform中顯示Xml數據?

我可以將響應類型(類)實例序列化爲XML字符串。但是當我在富文本框中顯示該字符串時,顯然顯示爲連續字符串;不像以下所示的XML。

<UserServiceAccesses> 
- <UserServiceAccess> 
- <Service> 
     <ID>0</ID> 
     <LocalID>Loggerr</LocalID> 
     <SystemID>-1</SystemID> 
     <ServiceType>U</ServiceType> 
     <Name>MyLogger</Name> 
     </Service> 
    <ClientPermissions /> 
    </UserServiceAccess> 
- <UserServiceAccess> 
-  <Service> 
     <ID>0</ID> 
     <LocalID>Logger2</LocalID> 
     <SystemID>-1</SystemID> 
     <ServiceType>U</ServiceType> 
     <Name>MyLogger2</Name> 
    </Service> 
    <ClientPermissions /> 
    </UserServiceAccess> 
<UserServiceAccesses> 

這裏,UserServiceAccesses是具有UserServiceAccess類型的屬性的類。然後UserServiceAccessService類型的屬性,ClientPermissions

我該怎麼辦?它可以是任何形式(樹,表,文本等),但它應該可以作爲XML讀取。由於我們從應用程序調用的Web方法很多,每次XML結構都會有所不同,所以我們不能有明確的模式。

+0

是張貼的代碼是有幫助的? –

回答

17

利用TreeView控件

這裏是工作的代碼對樹狀顯示XML:

using System; 
using System.Windows.Forms; 
using System.Xml; 

public class XmlTreeDisplay : System.Windows.Forms.Form 
{ 
    private System.Windows.Forms.TreeView treeXml = new TreeView(); 

    public XmlTreeDisplay() 
    { 
     treeXml.Nodes.Clear(); 
     this.Controls.Add(treeXml); 
     // Load the XML Document 
     XmlDocument doc = new XmlDocument(); 
     try 
     { 
      doc.LoadXml("<books><A property='a'><B>text</B><C>textg</C><D>99999</D></A></books>"); 
      //doc.Load(""); 
     } 
     catch (Exception err) 
     { 

      MessageBox.Show(err.Message); 
      return; 
     } 

     ConvertXmlNodeToTreeNode(doc, treeXml.Nodes); 
     treeXml.Nodes[0].ExpandAll(); 
    } 

    private void ConvertXmlNodeToTreeNode(XmlNode xmlNode, 
     TreeNodeCollection treeNodes) 
    { 

     TreeNode newTreeNode = treeNodes.Add(xmlNode.Name); 

     switch (xmlNode.NodeType) 
     { 
      case XmlNodeType.ProcessingInstruction: 
      case XmlNodeType.XmlDeclaration: 
       newTreeNode.Text = "<?" + xmlNode.Name + " " + 
        xmlNode.Value + "?>"; 
       break; 
      case XmlNodeType.Element: 
       newTreeNode.Text = "<" + xmlNode.Name + ">"; 
       break; 
      case XmlNodeType.Attribute: 
       newTreeNode.Text = "ATTRIBUTE: " + xmlNode.Name; 
       break; 
      case XmlNodeType.Text: 
      case XmlNodeType.CDATA: 
       newTreeNode.Text = xmlNode.Value; 
       break; 
      case XmlNodeType.Comment: 
       newTreeNode.Text = "<!--" + xmlNode.Value + "-->"; 
       break; 
     } 

     if (xmlNode.Attributes != null) 
     { 
      foreach (XmlAttribute attribute in xmlNode.Attributes) 
      { 
       ConvertXmlNodeToTreeNode(attribute, newTreeNode.Nodes); 
      } 
     } 
     foreach (XmlNode childNode in xmlNode.ChildNodes) 
     { 
      ConvertXmlNodeToTreeNode(childNode, newTreeNode.Nodes); 
     } 
    } 
    public static void Main() 
    { 
     Application.Run(new XmlTreeDisplay()); 
    } 
} 
+0

這太棒了。這正是我所期待的。我也發現這個MS支持文章提供了一些示例代碼來做同樣的事情:https://support.microsoft.com/en-us/kb/317597 – JeffC

8

一種簡單的方法是在表單中嵌入一個Internet Explorer ActiveX控件並將XML加載到該控件中。它將與IE的XML默認樣式表一起顯示。
有點像在網頁中使用iframe元素。

+0

添加到此答案,這是我想出來的:http://stackoverflow.com/questions/5157545/how-can-i-display-xml-with-webbrowser-control/42080286#42080286 –

19

嘗試應用縮進到XMLTEXT,如:

XDocument xDocument = XDocument.Parse(xmlText); 
myRichTextBox.Text = xDocument.ToString();//ToString will format xml string with indent 
//as XDocument class overrides ToString and return xml with indent 
+1

工作對我來說很好。謝謝! – TravisWhidden