整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          XML 注意事項

          里列出了您在使用 XML 時應該盡量避免使用的技術。

          Internet Explorer - XML 數據島

          它是什么?XML 數據島是嵌入到 HTML 頁面中的 XML 數據。

          為什么要避免使用它?XML 數據島只在 Internet Explorer 瀏覽器中有效。

          用什么代替它?您應當在 HTML 中使用 JavaScript 和 XML DOM 來解析并顯示 XML。

          如需更多有關 JavaScript 和 XML DOM 的信息,請訪問我們的 XML DOM 教程。

          XML 數據島實例

          本例使用 XML 文檔 "cd_catalog.xml"。

          把 XML 文檔綁定到 HTML 文檔中的一個 <xml> 標簽。id 屬性定義數據島的標識符,而 src 屬性指向 XML 文件:

          實例

          本實例只適用于 IE 瀏覽器

          <html>

          <body>

          <xml id="cdcat" src="cd_catalog.xml"></xml>

          <table border="1" datasrc="#cdcat">

          <tr>

          <td><span datafld="ARTIST"></span></td>

          <td><span datafld="TITLE"></span></td>

          </tr>

          </table>

          </body>

          </html>

          <table> 標簽的 datasrc 屬性把 HTML 表格綁定到 XML 數據島。

          <span> 標簽允許 datafld 屬性引用要顯示的 XML 元素。在這個實例中,要引用的是 "ARTIST" 和 "TITLE"。當讀取 XML 時,會為每個 <CD> 元素創建相應的表格行。

          Internet Explorer - 行為

          它是什么?Internet Explorer 5 引入了行為。行為是通過使用 CSS 樣式向 XML (或 HTML )元素添加行為的一種方法。

          為什么要避免使用它?只有 Internet Explorer 支持 behavior 屬性。

          使用什么代替它?使用 JavaScript 和 XML DOM(或 HTML DOM)來代替它。

          實例 1 - 鼠標懸停突出

          下面的 HTML 文件中的 <style> 元素為 <h1> 元素定義了一個行為:

          <html>

          <head>

          <style type="text/css">

          h1 { behavior: url(behave.htc) }

          </style>

          </head>

          <body>

          <h1>Mouse over me!!!</h1>

          </body>

          </html>

          下面顯示的是 XML 文檔 "behave.htc"(該文件包含了一段 JavaScript 和針對元素的事件句柄):

          <attach for="element" event="onmouseover" handler="hig_lite" />

          <attach for="element" event="onmouseout" handler="low_lite" />

          <script>

          function hig_lite()

          {

          element.style.color='red';

          }

          function low_lite()

          {

          element.style.color='blue';

          }

          </script>

          實例 2 - 打字機模擬

          下面的 HTML 文件中的 <style> 元素為 id 為 "typing" 的元素定義了一個行為:

          <html>

          <head>

          <style type="text/css">

          #typing

          {

          behavior:url(typing.htc);

          font-family:'courier new';

          }

          </style>

          </head>

          <body>

          <span id="typing" speed="100">IE5 introduced DHTML behaviors.

          Behaviors are a way to add DHTML functionality to HTML elements

          with the ease of CSS.<br /><br />How do behaviors work?<br />

          By using XML we can link behaviors to any element in a web page

          and manipulate that element.</p>v </span>

          </body>

          </html>

          下面顯示的是 XML 文檔 "typing.htc":

          <attach for="window" event="onload" handler="beginTyping" />

          <method name="type" />

          <script>

          var i,text1,text2,textLength,t;

          function beginTyping()

          {

          i=0;

          text1=element.innerText;

          textLength=text1.length;

          element.innerText="";

          text2="";

          t=window.setInterval(element.id+".type()",speed);

          }

          function type()

          {

          text2=text2+text1.substring(i,i+1);

          element.innerText=text2;

          i=i+1;

          if (i==textLength)

          {

          clearInterval(t);

          }

          }

          </script>

          如您還有不明白的可以在下面與我留言或是與我探討QQ群308855039,我們一起飛!

          一篇我們介紹了如何解析CSV和JSON數據:如何解析互聯網數據:CSV和JSON篇,今天我們將介紹如何解析HTML和XML數據。

          今天的介紹能夠幫助你輕而易舉地從網頁中(比如下面的中航電子的2017年一季度交易數據)提取自己想要的數據:

          準備

          在Python中可以解析html和xml數據的軟件包很多,今天我們介紹的是lxml,先安裝:

          $ pip install lxml

          如果不熟悉pip的使用,可以參考另一篇文章:如何管理python軟件包。

          解析HTML數據

          首先,回顧一下HTML的一些基本概念:

          • 標簽/tag:比如<html>, <h1>, <head>...一般成對出現,例如開始標簽<html>和結束標簽</html>

          • 元素/element:開始標簽到結束標簽整段代碼,標簽對之間的即為內容(content)

          • 屬性/attribute:標簽可擁有key=value形式的屬性,比如<div class="header">...</div>

          簡單地理解,HTML網頁就是由一組元素構成的一個集合。另外,大多數HTML標簽是可以嵌套的,因此元素可以包含一系列子元素。有了這些概念做基礎,我們將能夠很容易理解軟件包lxml的使用。實際上,在lxml里面,每個HTML元素對應一個lxml.html.HtmlElement對象,該對象提供一組標準的方法取訪問包含在該元素內部的數據,比如屬性、內容和子元素等。

          例子

          考察下面的鏈接,它提供中航電子在2017年第一季度的交易數據,我們打算從里面提取一些數據:

          >>> url = "http://quotes.money.163.com/trade/lsjysj_600372.html?year=2017&season=1"

          先把該網頁爬取下來:

          >>> import urllib2

          >>> rsp = urllib2.urlopen(url).read()

          >>> print rsp[0:15]

          <!DOCTYPE html>

          將字符串rsp轉換成HtmlElement對象:

          >>> from lxml import html

          >>> doc = html.document_fromstring(rsp)

          >>> type(doc)

          <class 'lxml.html.HtmlElement'>

          >>> doc.tag

          'html'

          所以其實doc就是一個html元素,它包含一些元素,比如head, body, link, div...

          比如,如果你想提取該網頁里面所有的鏈接(links):

          >>> links = [ link for link in doc.iterlinks() ]

          >>> len(links)

          106

          >>> links[0]

          (<Element link at 0x1029179f0>, 'href', 'http://img1.cache.netease.com/f2e/finance/gegu/s.1064000.css', 0)

          >>> links[0][2]

          'http://img1.cache.netease.com/f2e/finance/gegu/s.1064000.css'

          如果你想查看元素直接包含哪些子元素,可以調用getchildren()方法:

          >>> doc.getchildren()

          [<Element head at 0x10299a0a8>, <Element body at 0x10299a470>]

          對嵌套很深的元素,如果熟悉xpath表達式,最直接的辦法是調用xpath(...)方法:

          >>> [ td.text for td in doc.xpath('/html/body/div[2]/div[4]/table/tr[1]/td')]

          ['2017-03-31', '19.02', '19.50', '19.02', '19.30', '0.36', '1.90', '102,212', '19,747', '2.53', '0.58']

          此外,還可以通過find, findall, find_class, get_element_by_id等方法查找目標元素,比如:

          >>> [ td.text for td in doc.findall('./body/div[2]/div[4]/table/tr[1]/td')]

          ['2017-03-31', '19.02', '19.50', '19.02', '19.30', '0.36', '1.90', '102,212', '19,747', '2.53', '0.58']

          如果元素有屬性,提取屬性值也很方便,比如:

          >>> form = doc.forms[0]

          >>> form.tag

          'form'

          >>> form.attrib

          {'action': '/trade/lsjysj_600372.html', 'id': 'date'}

          >>> form.keys()

          ['id', 'action']

          >>> form.get('action')

          '/trade/lsjysj_600372.html'

          >>> form.items()

          [('id', 'date'), ('action', '/trade/lsjysj_600372.html')]

          '>>> form.form_values()

          [('year', '2017'), ('season', '1')]

          >>> form.method

          'GET'

          做為一個完整的例子,下面的腳本就是爬取中航電子在2017年第一季度的數據:

          輸出效果:

          (test) $ head -3 600372.csv

          日期;開盤價;最高價;最低價;收盤價;漲跌額;漲跌幅(%);成交量(手);成交金額(萬元);振幅(%);換手率(%)

          2017-03-31;19.02;19.50;19.02;19.30;0.36;1.90;102,212;19,747;2.53;0.58

          2017-03-31;19.02;19.50;19.02;19.30;0.36;1.90;102,212;19,747;2.53;0.58

          解析xml數據

          xml的格式和HTML類似,也是由標簽構成的,但是要比HTML文件簡單許多,看下面的xml文件片段處理:

          >>> xmlstr="""\

          ... <target name="run" depends="jar">

          ... <java fork="true" classname="${main-class}">

          ... <classpath>

          ... <path refid="classpath"/>

          ... <path refid="application"/>

          ... </classpath>

          ... </java>

          ... </target>"""

          >>> from lxml import etree

          第一步是獲取根節點:

          >>> root = etree.fromstring(xmlstr)

          >>> root.tag

          'target'

          如果要提取節點屬性:

          >>> root.items()

          [('name', 'run'), ('depends', 'jar')]

          >>> root.keys()

          ['name', 'depends'

          >>> root.get("name")

          'run'

          >>> root.values()

          ['run', 'jar']

          可以使用find, xpath等方法去獲取和查找子節點:

          >>> java = root.find("./java")

          >>> java.tag

          'java'

          >>> java.keys()

          ['fork', 'classname']

          >>> [ path.get("refid") for path in root.xpath("http://path")]

          ['classpath', 'application']

          lxml軟件的功能很強大,如果有興趣進一步了解,可以查看官方文檔:

          http://lxml.de/index.html

          今天就寫這么,歡迎大家留言、評論和關注。

          文將詳細介紹Spring Bean配置的三種不同方式的特點與使用條件。

          主要包括:

          • 基于XML的配置方式
          • 基于注解的配置方式
          • 基于Java類的配置方式

          一.基于XML的配置

          請看Spring學習(十二)Spring 的配置文件概述

          二.基于注解的配置

          Spring2.0開始引入基于注解的配置方式,即Bean的定義信息可以通過在Bean的實現類上標注注解實現。

          具體關于注解的知識請看Java注解(Annotation)介紹

          @Component是Spring容器中的基本注解,表示容器中的一個組件(bean),可以作用在任何層次,下面的示例介紹該注解的使用方法。

          注解配置示例:


          1. @Component("userDao")
          2. public class userDao{......}

          他等效于XML配置

          <bean id="userDao" class="cn.lovepi.***.userDao"/>

          此外,還有一些其他的可以被用來注解bean的注解,這些可以讓注解類本身的用途更加清晰,此外,特定的注解也具備特定的功能。

          Spring在2.5后提供了一個context的命名空間,它提供了通過掃描類包來加載利用注解定義的Bean的方式。

          在context中可以使用resource-pattern來過濾出特定的類。

          <context:component-scan base-package="cn.lovepi.spring" resource-pattern="anno/*.class"/>

          默認情況下加載的是package下的*.class即掃描全部類,在使用了resource-pattern之后,則只掃描package下的anno子包下的所有類。

          不過使用resource-pattern并不能提供給我們完善的功能,所有我們得使用過濾子元素的方法。


          1. <context:component-scan base-package="cn.lovepi.spring">
          2. <context:include-filter type="regex" expression="cn.lovepi.spring.*"/>
          3. <context:exclude-filter type="aspectj" expression="cn.lovepi..*Controller+"/>
          4. </context:component-scan>

          其中:

          include-filter表示要包含的目標類,

          exclude-filter表示要排除在外的目標類

          一個component-scan標簽下可以有多個include-filter和exclude-filter,

          過濾表達式所支持的類型如下表所示:

          在這些類型當中,除了Custom外,aspectj的過濾功能最強大,他能輕易的實現其他類別的過濾規則。

          Spring3.0提供了一系列的針對依賴注入的注解,這使得Spring IoC在XML文件之外多了一種可行的選擇,主要包含如下注解類型:

          • Bean的定義注解
          • Bean的生命周期注解
          • Bean的依賴檢查注解
          • Bean的自動裝配注解

          1.Bean的定義注解

          Spring自2.0開始,陸續引入了一些注解用于簡化Spring的開發。

          @Repository注解便屬于最先引入的一批,用于將數據訪問層(DAO層)的類標識為Spring Bean。具體使用如下:

          ①首先使用@Repository將DAO類聲明為Bean


          1. @Repository
          2. public class UserDaoImpl implements UserDao{......}

          ②在XML配置文件中啟動Spring的自動掃描功能


          1. <beans ...>
          2. <context:component-scan base-package="cn.lovepi.dao"/>
          3. ......
          4. <beans/>

          如此的話,我們便不在需要在XML當中顯式使用bean來進行bean的配置。Spring容器在初始化的時候便會自動掃描base-package所指定的包以及子包下面的所有class文件。所有標注為Repository的類將被自動注冊為bean。

          為什么Repository只能標注在DAO類上面呢?

          因為該注解的作用不只是將類識別為bean,同時他還能將所標注的類中所拋出的數據訪問異常封裝為Spring的數據訪問異常類型。Spring本身提供了一個豐富的,并且是與具體的訪問技術無關的數據訪問異常結構,用于封裝不同的持久層框架所拋出的異常,使得異常獨立與底層的框架。

          Spring2.5在@Repository的基礎上增加了功能類似的額外三個注解,總共有如下四種注解:

          • @Component:一個泛化的概念,表示一個組件(Bean),可作用在任何層次
          • @Controller:用于對Controller實現類進行標注,目前該功能與Component相同
          • @Repository:用于對DAO實現類進行標注
          • @Service:用于對Service實現類進行標注,目前該功能與Component相同

          這三個注解除了作用于不同軟件層次的類,其使用方式與Repository是完全相同的。

          2.Bean的生命周期注解

          在某些情況下,可能需要我們手工做一些額外的初始化或者銷毀操作,例如資源的獲取和是否操作,Spring1.x為此提供了兩種方式供用戶指定執行生命周期回調的方法:

          1. 實現Spring提供的兩個接口:initializingBeanDisposableBean,這種方法是要求bean類實現Spring的接口,但增加了bean和Spring容器的耦合度,因此不推薦使用。
          2. 在XML文件中使用<bean>的init-methoddestory-method 屬性,指定初始化之后和回調之前的回調方法。這兩個屬性的取值是bean中相應的初始化和銷毀方法的名稱。方法名稱任意,但是方法不能有參數。

          示例如下:


          1. <bean id="userService" class="cn.lovepi.***.UserService"
          2. init-method="init" destory-method="destory">
          3. </bean>

          在這里,我們指定了userService 這個bean的初始化方法為:init 銷毀方法為:destory

          Spring2.5在保留以上兩種方式的基礎上,提供了對JSR-250的支持。

          JSR-250規范定義了兩個用于指定聲明周期方法的注解:

          • @PostConstruct:初始化之后的執行的回調方法
          • @PreDestroy:銷毀之前的回調方法

          注解示例說明:


          1. public class PersonService{
          2. @PostConstruct
          3. public void init(){......}
          4. @PreDestory
          5. public void destory(){......}
          6. }

          在這里init方法是初始化之后執行的方法,而destory方法為銷毀之前執行的方法

          由于使用了注解,所以得激活Bean的后處理器,所以得在XML配置文件當中增加

          <context:annotation-config/>

          3.Bean的依賴檢查注解

          Spring2.0之前使用dependency-check在配置文件中設置屬性用于依賴檢查(只會檢查Setter方法是否被調用),缺點是粒度較粗,該屬性的取值包括以下幾種:

          • none: 默認不執行依賴檢查
          • simple :對原始基本類型和集合類型進行檢查
          • objects :對復雜類型進行檢查
          • all :對所有類型進行檢查

          使用Spring2.0提供的@Required注解,提供了更細粒度的控制,@Required注解只能標注在Setter方法之上,(標注在其他方法之上會被忽略 )用于檢查其是否被調用,當Setter方法未被調用的話會拋出異常。

          由于使用了注解,所以得激活Bean的后處理器,所以得在XML配置文件當中增加

          <context:annotation-config/>

          4.Bean的自動裝配注解

          @Autowired可以對成員變量、方法和構造函數進行標注,來完成自動裝配的工作,他根據類型進行自動裝配,如果需要按名稱進行裝配,則需要配合@Qualifier使用。

          當標注了@Autowired的方法所需的類型在Spring容器中不存在的話會拋出異常


          1. @Service
          2. public class LoginService{
          3. @Autowired
          4. private LogDao logDao;
          5. }

          如上面的例子所示,假如Spring容器中沒有LogDao這個bean的話便會拋出異常。

          解決的辦法便是使用required=false屬性來標注


          1. public class LoginService{
          2. @Autowired(required=false)
          3. private LogDao LogDao;
          4. }

          但是假如Spring當中存在多個所需類型的bean,那么便要使用@Qualifier注解來指定名稱。


          1. public class LoginService{
          2. @Autowired
          3. @Qualifier("userDao")
          4. private UserDao userDao;
          5. }

          @Autowired 可以對類中集合類的變量或方法入參進行標注,此時會將容器中類型匹配的所有Bean都注入進來,如下所示:


          1. public class loginService{
          2. @Autowired(required=false)
          3. public List<Plugin> pligins;
          4. public List<Plugin> getPlugins(){
          5. return plugins;
          6. }
          7. }

          Spring會將容器中所有類型為Plugin的bean都注入到集合中去。

          三.基于Java類的配置

          基于Java類定義Bean配置元數據,其實就是通過Java類定義Spring配置元數據,且直接消除XML配置文件。

          首先讓我們看一下基于Java類如何定義Bean配置元數據,具體步驟如下:

          1. 使用@Configuration注解需要作為配置的類,表示該類將定義Bean的元數據
          2. 使用@Bean注解相應的方法,該方法名默認就是Bean的名稱,該方法返回值就是Bean的對象。
          3. AnnotationConfigApplicationContext或子類進行加載基于java類的配置

          接下來通過示例來演示下如何基于Java類來配置Spring

          首先創建一個配置類


          1. @Configuration
          2. public class ApplicationContextConfig {
          3. @Bean
          4. public String message() {
          5. return "hello";
          6. }
          7. }<strong>
          8. </strong>

          然后還需要一個測試類,來查看配置是否成功


          1. public class ConfigurationTest {
          2. public static void main(String[] args) {
          3. AnnotationConfigApplicationContext ctx =
          4. new AnnotationConfigApplicationContext(ApplicationContextConfig.class);
          5. System.out.println(ctx.getBean("message"));
          6. }
          7. }

          通過@Configuration注解的類將被作為配置類使用,表示在該類中將定義Bean配置元數據,且使用@Configuration注解的類本身也是一個Bean,使用方式如下所示:


          1. @Configuration("ctxConfig")
          2. public class ApplicationContextConfig {
          3. ……
          4. }

          其中Configuration中的參數值即為該bean的名稱。

          通過@Bean注解配置類中的相應方法,則該方法名默認就是Bean名,該方法返回值就是Bean對象,并定義了Spring IoC容器如何實例化、自動裝配、初始化Bean邏輯,具體使用方法如下:


          1. @Bean(name={},
          2. autowire=Autowire.NO,
          3. initMethod="",
          4. destroyMethod="")

          其中name為bean的名稱,可以有多個,autowire為是否自動裝配,默認值為NO,initMethod為bean的初始化方法,destoryMethod為bean的銷毀方法。

          bean的注解具體使用如下:


          1. @Bean
          2. public String message() {
          3. return new String("hello");
          4. }

          如上的代碼等價與XML配置:


          1. <bean id="message" class="java.lang.String">
          2. <constructor-arg index="0" value="hello"/>
          3. </bean>

          注意使用bean注解的方法不能是private、final、static的。

          基于Java方式的配置方式不是為了完全替代基于XML方式的配置,兩者可以結合使用,因此可以有兩種結合使用方式:

          • 在基于Java方式的配置類中引入基于XML方式的配置文件
          • 在基于XML方式的配置文件中中引入基于Java方式的配置

          引入基于XML配置文件:


          1. <bean id="message" class="java.lang.String">
          2. <constructor-arg index="0" value="test"></constructor-arg>
          3. </bean>
          4. @Configuration("ctxConfig")
          5. @ImportResource("classpath:com/jike/***/appCtx.xml")
          6. public class ApplicationContextConfig {
          7. ……
          8. }

          可以看到在java程序中使用@ImportResource導入了XML的配置文件

          引入基于Java的配置文件:


          1. <context:annotation-config/>
          2. <bean id="ctxConfig" class=“com.jike.***..ApplicationContextConfig"/>
          3. //測試類
          4. public void testXmlConfig() {
          5. String configLocations[] = {" classpath:com/jike/***/appCtx.xml"};
          6. ApplicationContext ctx = new ClassPathXmlApplicationContext(configLocations);
          7. ……
          8. }

          可以看到在XML的配置文件當中將java的配置類當中Bean來聲明,第一行的是開啟注解驅動支持。

          值得注意的是必須得配置<context:annotation-config/>在XML配置文件中。

          Spring提供了一個AnnotationConfigApplicanContext類,能夠直接通過標注@Configuration的Java類啟動Spring容器:

          通過構造函數加載配置類:

          ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConf.class);

          通過編碼方式注冊配置類:


          1. AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
          2. ctx.register(DaoConfig.class);
          3. ctx.register(ServiceConfig.class);
          4. ctx.refresh();

          可以看到ctx注冊了多個configuration類,然后通過refresh類來刷新容器以應用這些配置文件。

          可以通過代碼一個個的引入配置類,當然也可以使用@Import注解來引入配置類

          引入多個配置類:


          1. @Configuration
          2. @Import(DaoConfig.class)
          3. public class ServiceConfig {……}

          總結:不同配置方式比較

          我們來看一下不同配置方式在不同方面的使用

          其實Spring支持這么多的配置方式,那么這些配置方式必然有其自己獨特的舞臺

          基于XML的配置主要使用場景:

          • 第三方類庫,如DataSource、JdbcTemplate等;
          • 命名空間,如aop、context等;

          基于注解的配置主要使用場景:

          • Bean的實現類是當前項目開發的,可直接在Java類中使用注解配置

          基于Java類的配置主要使用場景

          • 對于實例化Bean的邏輯比較復雜,則比較適合用基于Java類配置的方式

          在日常的開發中我們主要是使用XML配置注解配置方式向結合的開發方式,一般不推薦使用基于Java類的配置方式。


          主站蜘蛛池模板: 在线一区二区三区| 国产婷婷色一区二区三区| 激情无码亚洲一区二区三区| 亚洲国产一区二区a毛片| 精品少妇ay一区二区三区| 无码福利一区二区三区| 午夜视频在线观看一区二区| 无码毛片一区二区三区中文字幕| 国产一区二区高清在线播放| 免费播放一区二区三区| 国产一国产一区秋霞在线观看| 国产成人无码AV一区二区 | 国模吧无码一区二区三区| 亚洲av午夜福利精品一区| 中文字幕无线码一区2020青青| 一区二区三区www| 中文字幕一区二区三区5566| 精品一区二区三区AV天堂| 国产免费一区二区视频| 国产精品久久久久久一区二区三区| 一区二区三区电影在线观看| 精品一区精品二区制服| asmr国产一区在线| 麻豆va一区二区三区久久浪| 无码成人一区二区| 国产在线精品一区二区三区不卡| 国产一区二区三区乱码在线观看| 在线观看免费视频一区| 日韩一区二区精品观看| 国产成人综合一区精品| 福利视频一区二区牛牛| 亚洲AV无码一区二区一二区| 久久高清一区二区三区| 国产精品成人国产乱一区| 无码人妻aⅴ一区二区三区有奶水| 中文人妻无码一区二区三区| 国产一区视频在线免费观看| 欧亚精品一区三区免费| 久久久久人妻一区二区三区vr| 亚洲AV无码一区二区二三区软件 | 亚洲色欲一区二区三区在线观看|