精华内容
下载资源
问答
  • Flex 复杂XML 解析XML

    2014-05-25 14:40:49
    解析成:       ...解析结果如下面: ... var root:XML = ;  var rowLength :int = input.children().length();  var rowInfo:String = input.children().@['ID'];  for(var i:int=0;

    <root>
      <row ID="50300;123" 编号="shebei" 备用5="" 备用6="" />
      <row ID="455;50300" 编号="shebei" 备用5="" 备用6="" />
    </root>

    把ID分割成 ID='50300'和ID='123'

    <fx:Declarations>
      <fx:XML source="test/input.xml" id="input"/>
     </fx:Declarations>

    解析成:

    <root>

    <node label="名称">

       <node1 id='123'>
              <row ID="50300;123" 编号="shebei" 备用5="" 备用6="" />
            <row ID="455;50300" 编号="shebei" 备用5="" 备用6="" />

       <node1>

    <node/>

    </root>

    解析结果如下面:

     var root:XML = <root/>;
        var rowLength :int = input.children().length();
        var rowInfo:String = input.children().@['ID'];
        for(var i:int=0;i<rowLength;i++){
         var arr:Array = rowInfo.split(";");
         var row:XML =input.children()[i];
         for(var j:int=0;j<arr.length;j++){
          var node2:XML= ObjectUtil.clone(row) as XML;    
          // var info:ElemInfo = topoHandle.getElemById(arr[j]);
          
          if( topoHandle.getElemById(arr[j]) == null){
           continue;
          }
          var type:String =  topoHandle.getElemById(arr[j]).type;//不需要你们判断
          var node:XML;
          if(root.children().(@label == type )==undefined || input.children() ==null){
           node=<node/>;
           node.@label =‘名称’;//换成自己的名字
           root.appendChild(node);
          }else{
           node = root.children().(@label =='名称')[0];
          }
          var node1:XML;
          if(node.children() == null || node.children().(@id == arr[j]) == undefined){
           node1 = <node1/>;
           node1.@id = arr[j];
           node.appendChild(node1);
          }else{
           node1 = node.children().(@id == arr[j])[0];
          }
          node1.appendChild(node2);
         }
         
        }
        root.appendChild(node);
        //    trace(root);
        trace(node);

     

     

    写的比较烂  大家只看流程解析就可以 代码不好用 请见谅 提供的是思路

    展开全文
  • Android开发中,我们解析服务器给我们的数据一般就是JSON和XML 两种格式的内容。 JSON的解析我们可选的比较多 如Gson fastJson 等。我们之前说了 用GsonFormat来解析JSON并且自动生成相应的javabean, 一般来说,...

    Android开发中,我们解析服务器给我们的数据一般就是JSON和XML 两种格式的内容。
    JSON的解析我们可选的比较多 如Gson fastJson 等。我们之前说了 用GsonFormat来解析JSON并且自动生成相应的javabean, 一般来说,解析XML最快的方式,就是和服务器商量把数据传输方式换位JSON。。。但是有时候我们不可不免的遇到XML需要解析。如果少量的话,那么我们直接用JDK提供的pull方式去解析就可以了。
    但是如果比较多,也比较复杂。那么我们还是选择第三方库来完成比较好。

    XStream的jar包的下载。

    下载jar包请点击这里

    下载完成之后里面包含了 xstream.jar 和 xapp3.jar。

    Xstream序列化XML时可以允许用户使用不同的XML解析器,用户可以使用一个标准的JAXP DOM解析器或自Java6集成StAX解析器。这样用户就不需要依赖xpp3.jar。

     //XStream xstream = new XStream();//需要XPP3库
     //XStream xstream = new XStream(new DomDriver());//不需要XPP3库
     //XStream xstream = new XStream(new StaxDriver());//不需要XPP3库开始使用Java6

    由于也有许多版本了,而我开始下载的是1.4.8版本的。导入之后总是报错。后来看网上说是1.4.8要java8支持,没考证,不过的确换成1.4.7就可以了,而且看版本使用统计 1.4.7也的确是使用人数最多的。

    使用

    我们拿到那个内容的xml字符串之后。可以同过下面几句代码将内容转为javaBean

     XStream stream = new XStream();
     stream.processAnnotations(TestBean.class);//这里需要注解是你自己根据xml写的bean类(下面附代码解释xml)
     TestBean result = (TestBean) stream.fromXML(xmlStr);

    实例1

    xml内容为:

    <china dn="day">
        <city prov= "西安">
            <name>陕西</name>
            <age>18</age>
            <year>2016</year>
        </city>
        <city prov= "郑州">
            <name>河南</name>
            <age>20</age>
            <year>2016</year>
        </city>
        <city prov= "石家庄">
            <name>河北</name>
            <age>22</age>
            <year>2016</year>
        </city>
        <city prov= "三亚">
            <name>海南</name>
            <age>88</age>
            <year>2016</year>
        </city>
    </china>
    

    首先这个xml串,是有一个List 集合,然后因为有dn=“day”的属性,相当于和List同级有一个 字段

    然后每一个city 里面 有 prov 、name、age、year 等字段参数。

    我们编写一个javabean :

    @XStreamAlias("china")//类注解(必须写)
    public class ChinaBean {
    
        @XStreamAsAttribute() @XStreamAlias("dn") //属性注解
        private String dn;
        @XStreamImplicit(itemFieldName = "city")//节点注解(必须写)
        private List<CityBean> city;
        //省略dn 和 city 的 getter 和 setter 方法
    
        public static class CityBean {
            //值不用注解
            private int year;
            private String name;
            private int age;
            @XStreamAsAttribute() @XStreamAlias("prov")//属性是必须用注解声明的
            private String prov;
    
          //省略getter 和setter 方法
        }
    
    }

    如果xml的数据再复杂点

    如:点我获取天气预报的xml内容

    其实也没复杂多少,和上面的差不多,只不过多了好几个属性。

    这里写图片描述

    那么我们对照着写出这个天气预报的bean

    @XStreamAlias("china")//这里用到注解(必须写)
    public class TestBean {
    
        @XStreamAsAttribute() @XStreamAlias("dn")
        private String dn;
        /**
         * tem2 : -20
         * tem1 : -8
         * quName : 黑龙江
         * cityname : 哈尔滨
         * pyName : heilongjiang
         * stateDetailed : 多云
         * state2 : 1
         * state1 : 1
         * windState : 西北风3-4级转小于3级
         */
        @XStreamImplicit(itemFieldName = "city")//节点注解(必须写)
        private List<CityBean> city;
    
       //省略getter setter方法
    
        public static class CityBean {
            @XStreamAsAttribute() @XStreamAlias("tem2")
            private int tem2;
            @XStreamAsAttribute() @XStreamAlias("tem1")
            private int tem1;
            @XStreamAsAttribute() @XStreamAlias("quName")
            private String quName;
            @XStreamAsAttribute() @XStreamAlias("cityname")
            private String cityname;
            @XStreamAsAttribute() @XStreamAlias("pyName")
            private String pyName;
            @XStreamAsAttribute() @XStreamAlias("stateDetailed")
            private String stateDetailed;
            @XStreamAsAttribute() @XStreamAlias("state2")
            private int state2;
            @XStreamAsAttribute() @XStreamAlias("state1")
            private int state1;
            @XStreamAsAttribute() @XStreamAlias("windState")
            private String windState;
    
           //省略getter setter方法
        }
    
    }
    

    我们看看丁香园论坛的rss数据

    查看数据的请点击这里

    上个数据截图:

    这里写图片描述

    我们分析一下这个数据:

    1. 最外层是 rss 里面有 好几个属性(需要注解),还有一个 channel的内容。
    2. channel里面 有好几个内容,并且有一个image的类和 一个数据的List(需要注解)
    3. image类里面有三个内容,
    4. List中的每条Itembean 中 有几个内容,并且有一条内容还有属性(注解)
    5. 由于有的标签是dc:date 这种格式。但是我们的变量不能这样命名,所以这种需要注解来增加别名。

    我们一层一层去解析:

    @XStreamAlias("rss")  //别名注解
    public class DxyBean {
        @XStreamAsAttribute() @XStreamAlias("xmlns:dc")
        private String dc;
        @XStreamAsAttribute() @XStreamAlias("xmlns:rdf")
        private String rdf;
        @XStreamAsAttribute() @XStreamAlias("xmlns:taxo")
        private String taxo;
        @XStreamAsAttribute() @XStreamAlias("version")
        private String version;
    
        private ChannelBean channel;
    
       //省略getter setter方法
    
        public static class ChannelBean {
    
            private String title;
            private String link;
            private String description;
            private String language;
            private String pubDate;
            @XStreamAlias("dc:date")
            private String dcdate;
            @XStreamAlias("dc:language")
            private String dclanguage;
            private ImageBean image;
            @XStreamImplicit(itemFieldName = "item")//节点注解(必须写)
            private List<ItemBean> item;
    
            //省略getter setter方法
    
            public static class ImageBean {
    
                private String title;
                private String url;
                private String link;
    
            //省略getter setter方法
            }
    
    
            public static class ItemBean {
                private String title;
                private String link;
                private String description;
                private String category;
                private String pubDate;
                private String guid;
                @XStreamAlias("dc:creator")
                private String dccreator;
                @XStreamAlias("dc:date")
                private String dcdate;
                @XStreamAsAttribute()
                private String domain;
                //省略getter setter方法
            }
    
        }
    }
    

    这里写图片描述

    我们可以看到,对于属性的注解 1是必须写的,而如果我们的变量名 和标签里面的标签名相同,则相对于上图来说2那个注解是可以省略的。

    我们从上面几个栗子看到,有属性和有值的xml的解析方式,那么其他的类型应该也都是大同小异了。

    XStream的几种注解

    Xstream注解常用知识:

    @XStreamAlias("message") 别名注解  作用目标: 类,字段  
    @XStreamImplicit 隐式集合  
    @XStreamImplicit(itemFieldName="part")  作用目标: 集合字段  
    @XStreamConverter(SingleValueCalendarConverter.class) 注入转换器  作用目标: 对象  
    @XStreamAsAttribute 转换成属性  作用目标: 字段  
    @XStreamOmitField 忽略字段  作用目标: 字段  
    Auto-detect Annotations 自动侦查注解   
    xstream.autodetectAnnotations(true);  
    自动侦查注解与XStream.processAnnotations(Class[] cls)的区别在于性能.自动侦查注解将缓存所有类的类型.  

    参考了 XStream教程,点击查看教程

    展开全文
  • XML文件如下: <?xml version="1.0" encoding="gb2312"?> <air_info ret_value="1" date="14SEP(FRI)" from="SHA" to="CAN" fromname="上海虹桥" toname="广州" Mileage="1308" fule_adult="130" fule_...
  • Java解析复杂xml文件,需要使用到xpath,首先使用了Jdom2。代码示例如下:public static Document GetFileFromLocal(String filename){try {FileInputStream stream=new FileInputStream(String.format("d:/x下载/%s...

    Java解析复杂xml文件,需要使用到xpath,首先使用了Jdom2。代码示例如下:

    public static Document GetFileFromLocal(String filename){

    try {

    FileInputStream stream=new FileInputStream(String.format("d:/x下载/%s.xml", filename));

    SAXBuilder saxBuilder = new SAXBuilder();

    Document doc = saxBuilder.build(stream);

    return doc;

    } catch (FileNotFoundException e) {

    e.printStackTrace();

    } catch (JDOMException e) {

    e.printStackTrace();

    } catch (IOException e) {

    e.printStackTrace();

    }

    return null;

    }

    但是该xml解析器,不支持xpath。所以修改为dom4j。在dependency.xml文件里面添加依赖,maven会自动下载该jar文件:

    org.dom4j

    dom4j

    2.1.0

    解析xml代码示例如下:

    public class XmlHelper {

    public static Document parse(String url) {

    SAXReader reader = new SAXReader();

    Document document = null;

    try {

    document = reader.read(url);

    } catch (DocumentException e) {

    e.printStackTrace();

    }

    return document;

    }

    public static Element getRootElement(String url){

    SAXReader reader = new SAXReader();

    Document document = null;

    try {

    document = reader.read(url);

    } catch (DocumentException e) {

    e.printStackTrace();

    }

    return document.getRootElement();

    }

    public static Element getXmlElement(Element rootNode, String xpath) {

    if(rootNode==null||xpath==""){

    return null;

    }

    return rootNode.element(xpath);

    }

    public static String getXmlNodeText(Element rootNode, String xpath) {

    if(rootNode==null||xpath==""){

    return null;

    }

    Element element= rootNode.element(xpath);

    if(element==null){

    return "";

    }

    return element.getText();

    }

    }

    展开全文
  • TinyXml解析复杂xml字符串总结

    千次阅读 2013-07-31 16:59:38
    TinyXML是一个开源的解析XML解析库,能够用于C++,能够在Windows或Linux中编译。这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便的遍历这棵XML树。  下面我用个简单的例子说明如何...

           TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux中编译。这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便的遍历这棵XML树。tinyXML资源包见本人上传的资源,需要可下载!

          下面我用个简单的例子说明如何使用tinyXML操作xml文件。在讲例子之前我先说说tinyXML中主要类和xml文档之间的对应关系。下面是tinyXML中主要class的类图,反应各个类之间的静态关系。

        

          TiXmlBase是所有类的基类,TiXmlNode、TiXmlAttribute两个类都继承来自TiXmlBase类,其中TiXmlNode类指的是所有被<...>...<.../>包括的内容,而xml中的节点又具体分为以下几方面内容,分别是声明、注释、节点以及节点间的文本,因此在TiXmlNode的基础上又衍生出这几个类TiXmlComment、TiXmlDeclaration、TiXmlDocument、TiXmlElement、TiXmlText、TiXmlUnknown,分别用来指明具体是xml中的哪一部分。TiXmlAttribute类不同于TiXmlNode,它指的是在尖括号里面的内容,像<... ***=...>,其中***就是一个属性。这块我具体用一个xml文档说明一下,内容如下: 
    <?xml version="1.0" encoding="UTF-8"?> 

    <phonebook>     

        <!--one item behalfs one contacted person.-->     

        <item>         

             <name>miaomaio</name>     

            <addr>Shaanxi Xi'an</addr>     

            <tel>13759911917</tel>     

            <email>miaomiao@home.com</email>     

       </item>     

       <item>         

           <name>gougou</name>     

          <addr>Liaoning Shenyang</addr>     

          <tel>15840330481</tel>     

          <email>gougou@home.com</email>     

       </item>     

       <!--more contacted persons.--> 

    </phonebook> 

    *像TiXmlDeclaration指的就是<?xml version="1.0" encoding="UTF-8"?>,

    *像TiXmlComment指的就是<!--one item behalfs one contacted person.-->、 <!--more contacted person s.-->,

    *像TiXmlDocument指的就是整个xml文档,

    *像TiXmlElement指的就是<phonebook>、<item>、<name>、<addr>等等这些节点,

    *像TiXmlText指的就是‘gougou’、‘15840330481’这些夹在<item>与</item>、<name>与</name>、<addr> 与*</addr>之间的文本文字,

    *像TiXmlAttribute指的就是<?xml version="1.0" encoding="UTF-8"?>节点中version、encoding,

    *除此之外就是TiXmlUnknown。

    以上转载自别人博客!

            有关TinyXml解析的文章很多,比如:

             http://acnchen.i.sohu.com/blog/view/66703840.htm   C++中使用tinyXML简单例子     

             http://panpan.blog.51cto.com/489034/104961/  C++ XML解析之TinyXML篇  

            这两篇文章都不错,值得一看!  

           然而,对于复杂的xml字符串,这两篇文章都没有提到如何解析。于是,我研究了下,大体思路是:复杂的xml的特点是节点很多,并且经常出现节点嵌套节点。如何把每个节点的tag字段和内容字段提取出来是一个难题。这里我想到的思路是:对每一个节点,如果存在子节点,就递归地提取子节点;如果不存在子节点,就提取该节点。通过使用递归函数能够保证所有的节点都被提取到!示例代码如下:

    #include "tinyxml.h"
    #include <vector>

    //递归提取每个节点
    void GetEleNameAndValue(TiXmlElement* pEle)
    {
     TiXmlElement* pEleTemp=NULL;
     pEleTemp=pEle;
     if(pEleTemp)
     {
      TiXmlElement* childEleTemp=pEleTemp->FirstChildElement();

      while(childEleTemp)
      {
       GetEleNameAndValue(childEleTemp);
       childEleTemp=childEleTemp->NextSiblingElement();
      }
      if(childEleTemp==NULL)
      {
       const char* pText=pEleTemp->GetText();
       if(pText)
       {
        std::cout  << pEleTemp->Value() <<":"<<pEleTemp->GetText()<<std::endl;
       }
      }
     }
    }

    int main()
    {
     std::string xmlString = "<?xml version=\"1.0\" encoding=\"GBK\"?>\
               <nlp>\
            <version>1.0.0.5800</version>\
            <rawtext>大话西游</rawtext>\
            <parsedtext>大话西游 </parsedtext>\
            <result>\
             <focus>app</focus>\
             <action>\
              <operation>launch</operation>\
             </action>\
             <object>\
              <name>大话西游</name>\
             </object>\
            </result>\
            <result>\
             <focus>music</focus>\
             <action>\
              <operation>play</operation>\
             </action>\
             <object>\
              <name>大话西游</name>\
             </object>\
            </result>\
            <result>\
             <focus>dialog</focus>\
             <object>\
              <name>大话西游</name>\
              <topic>namecard</topic>\
             </object>\
             <content>我搜索了一下【大话西游】:《大话西游》是周星驰电影公司和大陆西影合作拍摄的一部经典的无厘头搞笑片,成就了大话的经典传奇。《大话西游》把周星驰推到了后现代主义喜剧大师的位置,进而推动了无厘头文化在中国的流行。电影“大话西游”分为《月光宝盒》和《仙履奇缘》这两部。</content>\
            </result>";
      TiXmlDocument* myDocument = new TiXmlDocument();
      myDocument->Parse(xmlString.c_str());  //提取xml字符串的声明部分
      TiXmlDeclaration* XmlDeclaration = myDocument->FirstChild()->ToDeclaration();
      std::cout<<"----------XML Declaration:------------------"<<std::endl;
      if(XmlDeclaration)
      {
      std::cout<<"Version: "<<XmlDeclaration->Version()<<std::endl;
         std::cout<<"Standalone: "<<XmlDeclaration->Standalone()<<std::endl;
         std::cout<<"Encoding: "<<XmlDeclaration->Encoding()<<std::endl;
      }
      //
      TiXmlElement* rootElement = myDocument->RootElement();  //Class
      TiXmlElement *ChildElement = rootElement->FirstChildElement();
      while ( ChildElement )
      {
     GetEleNameAndValue(ChildElement);
     ChildElement = ChildElement->NextSiblingElement();
      }
     
      return 0;
    }

    展开全文
  • 前言:对xstream不理解的请看: android XMl 解析神奇xstream 一: 解析android项目中 ...android XMl 解析神奇xstream 三: 把复杂对象转换成 xml   1、文件准备 把一个预先写好的xml文件放在android项目目录
  • 使用dom4j高效率xml解析,内涵demo程序,idea导入即可运行,适用于各种复杂xml的解析,给自己留作备份,有需要可下载。
  • 简单的xml我们可以通过转成javaBean实现解析。但是开发中xml一般都是一层嵌套一层的。转成javaBean明显是无法进行解析的。这里引入Sax解析。首先我们需要jdom.jar,没有的朋友可以从这里下载...
  • 复杂XML解析及组装

    2013-11-28 01:25:35
    此包可以解决XML文件的解析、对象转化为XML字符串的问题。 1 通过调用解析类,可以将XML的DATA数据转换为XmlNode对象,XmlNode以树形结构进行XML的数据封装,使用的时候按照树形结构进行数据的获取。 XmlNode...
  • 解析复杂xml

    千次阅读 2018-08-01 17:30:29
    好记忆不如烂笔头,能记下点东西,就记下...中规中矩的xml解析,都么有个啥,关键是复杂点的xml解析,而且是复杂点的一类xml,结构一样,但是内容完全不同 Demo.xml: &lt;soapenv:Envelope xmlns:soapenv="...
  • 前言:对xstream不理解的请看: android XMl 解析神奇xstream 一: 解析android项目中 asset 文件夹 下的 aa.xml 文件 android XMl 解析神奇xstream 二: 把...android XMl 解析神奇xstream 四: 将复杂xml文件解
  • 1、流行的XML解析框架1》底层解析方式:存在编码复杂性、难扩展、难复用....。想了解底层解析方式请参考:浅谈 Java XML 底层解析方式2》Dom4j:基于 JAXP 解析方式,性能优异、功能强大、极易使用的优秀框架。3》...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,156
精华内容 862
关键字:

复杂xml解析