zoukankan      html  css  js  c++  java
  • .net 解析xml字符串

    http://www.blogjava.net/JAVA-HE/archive/2007/02/07/98527.html

    对两种情况,这个文件不需要修改:

    1 import org.xml.sax.Attributes;
     2 import org.xml.sax.helpers.DefaultHandler;
     3 import org.xml.sax.SAXException;
     4 import java.util.Properties;
     5 
     6 public class ConfigParser extends DefaultHandler
     7 {
     8     ////定义一个Properties 用来存放 dbhost dbuser dbpassword的值
     9     private Properties props;
    10     
    11     private String currentSet;
    12     private String currentName;
    13     private StringBuffer currentValue = new StringBuffer();
    14     //构建器初始化props
    15     public ConfigParser()
    16     {
    17         this.props = new Properties();
    18     }
    19     public Properties getProps()
    20     {
    21         return this.props;
    22     }
    23     
    24     
    25     //定义开始解析元素的方法. 这里是将<xxx>中的名称xxx提取出来.
    26     public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException
    27     {
    28         currentValue.delete(0, currentValue.length());
    29         this.currentName =qName;
    30     }
    31     //这里是将<xxx></xxx>之间的值加入到currentValue
    32     public void characters(char[] ch, int start, int length) throws SAXException
    33     {
    34         currentValue.append(ch, start, length);
    35     }
    36     //在遇到</xxx>结束后,将之前的名称和值一一对应保存在props中
    37     public void endElement(String uri, String localName, String qName) throws SAXException
    38     {
    39         props.put(qName.toLowerCase(), currentValue.toString().trim());
    40 //System.out.println(qName.toLowerCase() + " " + currentValue.toString().trim());
    41     }
    42 }
    43 

    这个文件中注释 与注释之间的是对不同情况的对比:

    1 import java.net.URL;
     2 import java.util.Properties;
     3 import javax.xml.parsers.SAXParser;
     4 import javax.xml.parsers.SAXParserFactory;
     5 
     6 public class ParseXML
     7 {
     8     //定义一个Properties 用来存放标签值
     9     private Properties props;
    10     public Properties getProps()
    11     {
    12         return this.props;
    13     }
    14     public void parse(String filename) throws Exception
    15     {
    16         //将解析器对象化
    17       try
    18         {
    19           ConfigParser handler = new ConfigParser();
    20         //获取SAX工厂对象
    21         SAXParserFactory factory = SAXParserFactory.newInstance();
    22         factory.setNamespaceAware(false);
    23         factory.setValidating(false);
    24         //获取SAX解析
    25         SAXParser parser = factory.newSAXParser();
    26      
    27 /////////////////////////////////////////////////////////////////////////////
    28 //对字符串解析:
    29 //            InputSource is = new InputSource ();
    30 //            StringReader xmlStr = new StringReader (filename);
    31 //            is.setCharacterStream (xmlStr);
    32 //            parser.parse (is,handler);
    33  ////////////////////////////////////////////////////////////////////////////    
    34             
    35 ////////////////////////////////////////////////////////////////////////////
    36 //  对文件解析:
    37         URL confURL = getClass().getResource(filename);
    38         if(confURL == null) System.out.println("error");
    39         
    40             //将解析器和解析对象xml联系起来,开始解析
    41             parser.parse(confURL.toString(), handler);
    42 /////////////////////////////////////////////////////////////////////////
    43           props = handler.getProps();
    44         }
    45      catch(Exception e)
    46      {
    47          System.out.println (e.toString ());
    48      }
    49     }
    50 }
    51 
    52 

    测试程序:

    1 import java.util.*;
     2 
     3 public class Main
     4 {
     5     static ParseXML px = new ParseXML ();
     6     public static void main (String[] args)
     7     {
     8         //load_properties ();   //解析xml文件
     9         load_properStr();  //解析字符串用这个方法
    10         String  issuccessful = (String) getObject ("result");
    11         String  objRequestID =  (String) getObject ("msg");
    12         System.out.println ("issuccessful ::"+issuccessful);
    13         System.out.println ("objRequestID ::"+objRequestID);
    14         
    15     }
    16     
    17     public static void load_properStr ()
    18     {
    19         
    20         String str = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"+
    21                 "<response>"+
    22                 "<result>0</result>"+
    23                 "<msg>47F42A2D578</msg>"+
    24                 "</response>";
    25         try
    26         {
    27             px.parse (str);
    28         }
    29         catch (Exception ex)
    30         {
    31             ex.printStackTrace ();
    32         }
    33         
    34     }
    35     public static void  load_properties ()
    36     {
    37         try
    38         {
    39             px.parse ("/properties.xml");
    40         }
    41         catch (Exception ex)
    42         {
    43             ex.printStackTrace ();
    44         }
    45     }
    46     public static Object getObject (String keyname)
    47     {
    48         return px.getProps ().getProperty (keyname);
    49     }
    50 }
    51 


    Silverlight中XmlReader解析XML的流程

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



    /*
    string xmlString = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><bookstore><book genre='novel' ISBN='10-861003-324'><title>The Handmaid's Tale</title><price>19.95</price></book><book genre='novel' ISBN='1-861001-57-5'><title>Pride And Prejudice</title><price>24.95</price></book></bookstore>";
    */
    public string GetXmlStrings(string xmlString)
            {
                StringBuilder output = new StringBuilder();

                // Load the file and ignore all white space.
                XmlReaderSettings settings = new XmlReaderSettings();
                settings.IgnoreWhitespace = true;
                using (XmlReader reader = XmlReader.Create(new StringReader(xmlString), settings))
                {
                    while (reader.Read())
                    {
                        if ((reader.IsStartElement()) && (reader.LocalName == "book")) //读取Table的显示名称和Tabel的名称
                        {
                            using (XmlReader reader1 = reader.ReadSubtree())
                            {
                                if (reader1.ReadToDescendant("book"))
                                {
                                    while (reader1.Read())
                                    {
                                        if (reader1.NodeType == System.Xml.XmlNodeType.Element)
                                        {
                                            //当前节点不是空值
                                            if (!reader1.IsEmptyElement)
                                            {
                                                string nodeName = reader1.Name;
                                                reader1.Read();
                                                if (reader1.NodeType == System.Xml.XmlNodeType.Text)
                                                {
                                                    output.AppendLine(nodeName + "=" + reader1.Value);
                                                }
                                                reader1.Read();
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
                return output.ToString();
            }

    http://www.iwms.net/n679c12.aspx

    http://www.ehelper.com.cn/blog/post/csharp-xml.html

     http://hi.baidu.com/sophyishere/blog/item/ffc31c2e36ed1ae18a139936.html

    http://qkhhwxfqqq.blog.163.com/blog/static/12653894520102299858788/

    http://www.591cto.com/wangluokaifa/XML/2011/0721/25988.html

    http://my.oschina.net/duluo180/blog/9888

    http://www.diybl.com/course/4_webprogram/xml/xml_js/2008324/106496.html

    http://msdn.microsoft.com/zh-cn/library/system.xml.xmlreader.movetonextattribute(v=VS.95)

  • 相关阅读:
    菜根谭#77
    菜根谭#76
    菜根谭#75
    菜根谭#74
    菜根谭#73
    python迭代器
    python爬取网页数据
    yii2验证规则
    python装饰器的理解
    php中多图上传采用数组差集处理(array_diff,array_map)
  • 原文地址:https://www.cnblogs.com/Kingly/p/2201789.html
Copyright © 2011-2022 走看看