使用XMLReader解析问题(使用ReadSubTree) [英] problem parsing with XMLReader (using ReadSubTree)

查看:105
本文介绍了使用XMLReader解析问题(使用ReadSubTree)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试在我的CF应用程序中构建一个简单的XML到控件解析器。
在字符串im下面试图解析的代码如下:

Im trying to build a simple XML to Controls parser in my CF application. In the code below the string im trying to parse looks like this:

"<Panel><Label>Text1</Label><Label>Text2</Label></Panel>"

我想要用此代码生成的结果将是一个带有两个标签的面板。
但是问题是当解析第一个Label时,subreader.Read()在ParsePanelElementh方法中返回false,因此它不在while语句中。
由于XMLReader是我的新手,所以我必须缺少一些非常简单的东西。
任何帮助将不胜枚举!

The result i want with this code would be a Panel with two labels. But the problem is when the first Label is parsed the subreader.Read() returns false in the ParsePanelElementh method, and so it falls out of while statement. Since im new into XMLReader i must be missing something very simple. Any help would be apreciated !

和平。

static class XMLParser
{
    public static Control Parse(string aXmlString)
    {
        XmlReader reader = XmlReader.Create(new StringReader(aXmlString));
        return ParseXML(reader);
    }

    public static Control ParseXML(XmlReader reader)
    {
        using (reader)
        {
            while (reader.Read())
            {
                if (reader.NodeType == XmlNodeType.Element)
                {
                    if (reader.LocalName == "Panel")
                    {
                        return ParsePanelElement(reader);
                    }

                    if (reader.LocalName == "Label")
                    {
                        return ParseLabelElement(reader);
                    }
                }
            }
        }
        return null;
    }

    private static Control ParsePanelElement(XmlReader reader)
    {
        var myPanel = new Panel();
        XmlReader subReader = reader.ReadSubtree();
        while (subReader.Read())
        {
            Control subControl = ParseXML(subReader);
            if (subControl != null)
            {
                myPanel.Controls.Add(subControl);
            };
        }
        return myPanel;
    }

    private static Control ParseLabelElement(XmlReader reader)
    {
        reader.Read();
        var myString = reader.Value as string;
        var myLabel = new Label();
        myLabel.Text = myString;
        return myLabel;
    }
}


推荐答案

问题在于,读取器读取了两次,一次在 ParsePanelElement 中,一次在 ParseXML 中。这样,您可以解析面板,跳过第一个标签,最后添加第二个标签。

The problem is that the reader reads twice, once in ParsePanelElement and once in ParseXML. This way you parse the panel, skip the first label and eventually add the second label.

此代码在Visual Studio 9下工作。(我已经移动了using子句)

This code works under Visual Studio 9. (I have moved the using clause)

   static class Program
   {
      /// <summary>
      /// The main entry point for the application.
      /// </summary>
      [STAThread]
      static void Main()
      {
         Control Test = XMLParser.Parse("<Panel><Label>Text1</Label><Label>Text2</Label></Panel>");
         for (Int32 i = 0; i < Test.Controls.Count; i++)
         {
            System.Diagnostics.Debug.WriteLine("Control " + i + ": " + Test.Controls[i].GetType().FullName + " [TEXT = " + Test.Controls[i].Text + "]");
         }
      }

      static class XMLParser
      {
         public static Control Parse(string aXmlString)
         {
            Control result = null;
            using (StringReader strReader = new StringReader(aXmlString))
            {
               using (XmlReader reader = XmlReader.Create(strReader))
               {
                  result = ParseXML(reader);
               }
            }
            return result;
         }

         public static Control ParseXML(XmlReader reader)
         {
            while (reader.Read())
            {
               if (reader.NodeType == XmlNodeType.Element)
               {
                  if (reader.LocalName == "Panel")
                  {
                     return ParsePanelElement(reader);
                  }

                  if (reader.LocalName == "Label")
                  {
                     return ParseLabelElement(reader);
                  }
               }
            }
            return null;
         }

         private static Control ParsePanelElement(XmlReader reader)
         {
            var myPanel = new Panel();
            using (XmlReader subReader = reader.ReadSubtree())
            {
               while (subReader.Read())
               {
                  Control subControl = ParseXML(subReader);
                  if (subControl != null)
                  {
                     myPanel.Controls.Add(subControl);
                  };
               }
            }
            return myPanel;
         }

         private static Control ParseLabelElement(XmlReader reader)
         {
            reader.Read();
            var myString = reader.Value as string;
            var myLabel = new Label();
            myLabel.Text = myString;
            return myLabel;
         }
      }
   }

这篇关于使用XMLReader解析问题(使用ReadSubTree)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆