zoukankan      html  css  js  c++  java
  • Silverlight 2使用C#遍历XML(兼容Silverlight3)

    在Silverlight 1.1中,C#只能用XmlReader这样一个非常轻量级的东西来解析XML,因此稍有不慎就会出现很多非常奇怪的错误,在这里对XML的解析做一个简单的流程介绍吧。

    在对流式XML的解析中,XmlReader对XML节点进行一些区分,这些节点的类型包括:

    引用内容:
    public enum XmlNodeType
    {
        None = 0,
        Element = 1,
        Attribute = 2,
        Text = 3,
        CDATA = 4,
        EntityReference = 5,
        Entity = 6,
        ProcessingInstruction = 7,
        Comment = 8,
        Document = 9,
        DocumentType = 10,
        DocumentFragment = 11,
        Notation = 12,
        Whitespace = 13,
        SignificantWhitespace = 14,
        EndElement = 15,
        EndEntity = 16,
        XmlDeclaration = 17,
    }

    其中常用到的有Element、Attribite、Text、CDATA、EndElement等。其中Element类型的节点为“<item>”形式,EndElement的的节点为“</item>”形式,而Text类型则可以为一对标记之间的文本内容或者节点之间的空格、换行等。

    了解了这些,我们再来看怎么从一个XML文件流中找出自己想要的数据。首先假设有一个这样的XML数据流,其XML结构如下:

    引用内容:
    <root>
      <item>
        <Title>网球王子</Title>
        <Catalog>热门动漫</Catalog>
        <Author>OOboy.net</Author>
        <Email />
        <Modified>Thu, 16 Aug 2007 09:39:19 GMT</Modified>
      </item>
      <item>
        <Title>越狱</Title>
        <Catalog>海外剧场</Catalog>
        <Author>OOboy.net</Author>
        <Email />
        <Modified>Thu, 16 Aug 2007 09:39:19 GMT</Modified>
      </item>
    </root>

    我们用XmlReader的Create方法从这个Stream中创建了一个XmlReader对象,现在我们解析出想要的数据——item项目中的各个子项:Title、Catalog、Author、Email、Modified。

    解析过程在下面代码的注释中:

    引用内容:
    //reader是一个XmlReader实例
    //开始读取流,直到读完为止
    //reader.Read()每次读取一个XML节点(XML节点的描述在本文开头)
    while (reader.Read())
    {
        //如果该节点是一个开始节点,而且节点的名称叫做item
        //那么我们继续读取item子树
        if ((reader.IsStartElement()) && (reader.LocalName == "item"))
        {
            //创建一个新的Item对象,后面把数据保存到Item对象中
            Item item = new Item();

            //继续读取Item下面的内容
            using (XmlReader itemReader = reader.ReadSubtree())
            {
                //开始读取Item下面的内容,知道读完Item子树为止
                //当碰到节点</item>时会跳出循环
                while (itemReader.Read())
                {
                    //如果找到一个Element,我们就读取其中的值
                    //用这种节点可以忽略空格、回车等等
                    if (itemReader.NodeType == XmlNodeType.Element)
                    {
                        //如果是空节点,比如上文中的<Email />这样的节点
                        //此时读取下一个节点,否则会出错
                        if (itemReader.IsEmptyElement)
                        {
                            continue;
                        }

                        //如果不是空节点
                        //把节点的name记录下来
                        string nodeName = itemReader.Name;

                        //读取节点内地文本节点
                        itemReader.Read();
                        if (itemReader.NodeType == XmlNodeType.Text)
                        {
                            //根据节点的name,把值保存到Item对应的属性中
                            switch (nodeName.ToUpper())
                            {
                                case "TITLE":
                                    item.title = itemReader.Value;
                                    break;
                                case "CATALOG":
                                    item.catalog = itemReader.Value;
                                    break;
                                case "AUTHOR":
                                    item.author = itemReader.Value;
                                    break;
                                case "EMAIL":
                                    item.email = itemReader.Value;
                                    break;
                                case "MODIFIED":
                                    item.modified = itemReader.Value;
                                    break;
                            }
                        }
                        //读取完成,再读结束节点End Element
                        itemReader.Read();
                    }
                }
            }
        }
    }

  • 相关阅读:
    常用的清理 Kubernetes 集群命令
    mask彻底禁用systemctl服务
    ansibleplaybook指定role limit
    极速理解设计模式系列:16.迭代器模式(Iterator Pattern)
    极速理解设计模式系列:19.备忘录模式(Memento Pattern)
    极速理解设计模式系列:8.策略模式(Strategy Pattern)
    极速理解设计模式系列:6.适配器模式(Adapter Pattern)
    PostSharp AOP编程:2.PostSharp的OnMethodBoundaryAspect类基本组成
    极速理解设计模式系列:18.访问者模式(Visitor Pattern)
    极速理解设计模式系列:10.抽象工厂模式(Abstract Factory Pattern)
  • 原文地址:https://www.cnblogs.com/slteam/p/1605454.html
Copyright © 2011-2022 走看看