Python xml解析庫xml_models2

今天給大家介紹一個(gè)用于處理xml的開源庫xml_models2,它主要能用來對(duì)xml文件進(jìn)行解析。這個(gè)庫建立在lxml之上,相比python自帶的xmlElementTree、lxml比較底層的xml處理方式(lxml其實(shí)還行),它充分利用了python元類的自?。ㄔ幊蹋┨匦裕试S用戶根據(jù)相應(yīng)xml的結(jié)構(gòu)定義自己的model,在model的每個(gè)字段中指定對(duì)應(yīng)的xpath,利用lxml的xml處理功能將xml中對(duì)應(yīng)路徑的節(jié)點(diǎn)和內(nèi)容提取出來。與其說這是一個(gè)xml處理,更不如說它是一個(gè)輕量級(jí)的處理xml數(shù)據(jù)的ORM,只不過并沒有與數(shù)據(jù)庫打交道而已。

如引言里面描述的那樣,xml_models2能夠通過自定義model來序列化xml,獲取自己感興趣的節(jié)點(diǎn)的內(nèi)容。假如我們有如下一個(gè)xml:

<Person id="112">
  <firstName>Chris</firstName>
  <lastName>Tarttelin</lastName>
  <occupation>Code Geek</occupation>
  <website>http://www.pyruby.com</website>
  <contact-info>
    <contact type="telephone">
      <info>(555) 555-5555</info>
      <description>Cell phone, but no calls during work hours</description>
    </contact>
    <contact type="email">
      <info>me@here.net</info>
      <description>Where possible, contact me by email</description>
    </contact>
    <contact type="telephone">
      <info>1-800-555-5555</info>
      <description>Toll free work number for during office hours.</description>
    </contact>
  </contact-info>
</Person>

為了獲取相應(yīng)的數(shù)據(jù),我們就可以定義如下的model:

class Person(Model):
    id = IntField(xpath="/Person/@id")
    firstName = CharField(xpath="/Person/firstName")
    lastName = CharField(xpath="/Person/lastName")
    contacts = CollectionField(ContactInfo, order_by="contact_type", xpath="Person/contact-info/contact")

class ContactInfo(Model):
    contact_type = CharField(xpath="/contact/@type")
    info = CharField(xpath="/contact/info")
    description = CharField(xpath="/contact/description", default="No description supplied")

Person和ContactInfo model繼承自積累xml_models.Model,IntField,CharField,CollectionField等字段類型都是xml_models提供的字段類型,相信用過像比如SQLAlchemy或者Django ORM的童鞋應(yīng)該不會(huì)陌生,只不過這里在使用這些字段的時(shí)候指定的值是一些xpath的值用來指定xml文件中相應(yīng)節(jié)點(diǎn)的路徑。定義好model之后,只要簡(jiǎn)單調(diào)用就能取到我們想要的數(shù)據(jù):

>>> person = Person(xml_str)
>>> person.contacts[0].info
me@here.com

在解析xml的時(shí)候,嵌套重復(fù)有規(guī)則的xml數(shù)據(jù)可能會(huì)經(jīng)常會(huì)用到CollectionField,除了像上面定義model的方式指定集合,也能夠直接在model里面指定collection_node:

class SomeModel(Model):
  fieldA = CharField(xpath="/some/node")

  collection_node = 'collection'

在這個(gè)庫里面還封裝了requests的一些基本功能,這樣允許我們直接通過自定義的model里面發(fā)起http請(qǐng)求從提供的api獲取數(shù)據(jù):

data = SomeModel.objects.filter_custom(url_address_xxx).get()

獲取直接能夠通過rest api查詢查詢一些數(shù)據(jù):

class Person(xml_models.Model:
    ...
    finders = { (firstName, lastName): "http://person/firstName/%s/lastName/%s",
                (id,): "http:xxxx//person/%s"}
>>> people = Person.objects.filter(firstName='Chris', lastName='Tarttelin')
>>> people.count()
1
>>> person = Person.objects.get(id=123)
>>> person.firstName
Chris

除了如上所示提到的這些,xml_models2還有一些比較好玩的功能:
to_xml(): 將xml序列化之后,我們可能會(huì)做一些更改,更改之后調(diào)用這個(gè)api能夠生成包含更改內(nèi)容的xml;甚至能夠先定義model,實(shí)例化自己的model實(shí)力然后生成xml。
validate_on_load(): 在model中這個(gè)方法一個(gè)很好的“鉤子”,方便我們?cè)谛蛄谢臅r(shí)候進(jìn)行一些自定義的驗(yàn)證。
blablablanla...

這個(gè)庫并沒有出來多久,是在另外一個(gè)開源庫xml_models上面fork而來,對(duì)大部分的代碼進(jìn)行了重構(gòu),特別是元類Model/ModelBase那塊。另外項(xiàng)目的文檔,代碼注釋,單元測(cè)試都很完整,非常鼓勵(lì)有興趣的童鞋可以關(guān)注一下。

差不多就給大家介紹到這里,更多的內(nèi)容大家可以查看庫的文檔github主頁。感興趣的同學(xué)可以試用一下,有什么問題可以去主頁上提issue或者pr。

這篇文章大部分部分的內(nèi)容都是從文檔搬來的,稍稍加了些自己的一些理解加以豐富,方便大家開始使用。

https://github.com/alephnullplex/xml_models2

http://xml-models2.readthedocs.org/en/latest/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容