【问题标题】:How to show Xml data in the winform in the XML fashion?如何以 XML 方式在 winform 中显示 XML 数据?
【发布时间】:2011-07-05 12:43:22
【问题描述】:

我的 winform 应用程序与 Web 服务通信。对于某些需求,我需要在 winform 应用程序中以 XML 格式呈现 Web 服务响应。

我可以将响应类型(类)实例序列化为 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 类型属性的类。那么UserServiceAccess有一个Service类型的属性,ClientPermissions

我该怎么做?它可以是任何形式(树、表格、文本等),但它应该可以作为 XML 读取。由于我们从应用程序中调用了许多 Web 方法,因此每次 XML 结构都会不同,因此我们无法有明确的架构。

【问题讨论】:

  • 贴出来的代码有用吗??

标签: c# .net winforms xml-serialization


【解决方案1】:

利用TreeView控件

这是在 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());
    }
}

【讨论】:

【解决方案2】:

尝试对 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

【讨论】:

  • 对我来说效果很好。谢谢!
【解决方案3】:

一种简单的方法是在表单中嵌入 Internet Explorer ActiveX 控件并将 XML 加载到其中。它将与 IE 的 XML 默认样式表一起显示。
有点像在网页中使用 iframe 元素。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多