最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python使用lxml xpath模塊解析XML遇到的坑及解決

 更新時(shí)間:2024年05月24日 14:59:37   作者:weixin_45906169  
這篇文章主要介紹了python使用lxml xpath模塊解析XML遇到的坑及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

項(xiàng)目場(chǎng)景

解析電子病歷CDA文檔,由于CDA文檔是XML 格式的,有些節(jié)點(diǎn)的屬性值需要修改。

問題描述

在使用python 解析xml時(shí),百度了很多方面的資料,其實(shí)都不盡人意,要么示例不夠詳細(xì),要么示例本身就是坑,總結(jié)一下,主要遇到的是這幾個(gè)方面的問題

1.使用etree.fromstring(new_doc_content)報(bào)錯(cuò)

ValueError: Unicode strings with encoding declaration are not supported. Please use bytes input or XML fragments without declaration.

在這里插入圖片描述

2.xpath無法獲取值、返回值為[]或者{}的問題

原因分析

1.由于數(shù)據(jù)是從數(shù)據(jù)庫(kù)查詢出來得到的,所以etree.fromstring(new_doc_content)需要傳 byte string

2.由于CDA文檔含有字符聲明,以及命名空間的,在使用常規(guī)的xpath語(yǔ)法取不到數(shù)據(jù),或者有些text能取到,其他節(jié)點(diǎn)或者屬性值取不到。那么在含有命名空間的xml數(shù)據(jù)里,xpath需要將命名空間也帶上才能正常取到,其實(shí)問題就出在命名空間這里,從網(wǎng)上百度出來的資料,有些命名空間寫成了

ns = {"d" : "http://www.sitemaps.org/schemas/sitemap/0.9"}
url = root.xpath("http://d:loc", namespaces=ns)

正是這里把我?guī)肓苏`區(qū),使用這個(gè)方式反復(fù)調(diào)試,始終是取不到數(shù)據(jù),從其他地方查到的資料很多也是類似的這種寫法,同時(shí)也忽略掉了一些不一樣的點(diǎn)。

例如這樣的寫法:

url = root.xpath("http://d:loc", namespaces={'d' : 'http://www.sitemaps.org/schemas/sitemap/0.9'})`

咋一看只是namespaces的值事先定義好了而已,沒有往其他方向想。

后來通過foo_tree = etree.ElementTree(xml) 然后通過遍歷foo_tree.getroot()修改屬性內(nèi)容,雖然說能解決,但是還是想通過xpath來查詢定位,因?yàn)橹芭老x用過xpath,知道它的便利之處,回過頭來還是要去解決xpath這個(gè)問題。

猛回頭,發(fā)現(xiàn)namespaces字典定義的區(qū)別,單引號(hào) 和雙引號(hào)這里有所不同。那就是試試把,將雙引號(hào)改成了單引號(hào)。

啪,完美,它起作用了,能找到節(jié)點(diǎn)了。

解決方案

1.將str轉(zhuǎn)換成byte string

etree.fromstring(new_doc_content.encode('utf-8'))

2.將namespaces定義的字典中的雙引號(hào)換成單引號(hào)

url = root.xpath("http://d:loc", namespaces={'d' : 'http://www.sitemaps.org/schemas/sitemap/0.9'})`

示例XML

<?xml version="1.0" encoding="UTF-8"?> 
<ClinicalDocument xmlns="urn:hl7-org:v3" xmlns:mif="urn:hl7-org:v3/mif" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:hl7-org:v3 ..\sdschemas\SDA.xsd"> 
<realmCode code="CN"/> 
<typeId root="2.16.840.1.113883.1.3" extension="POCD_MT000040"/> 
<templateId root="2.16.156.10011.2.1.1.33"/> 
<id root="2.16.156.10011.1.1" extension="545ED988-5235-45F1-BBFD-9326D74FAA43"/> 
<code code="00000" codeSystem="545ED988-5235-45F1-BBFD-9326D74FAA43" codeSystemName="衛(wèi)生信息共享文檔規(guī)范編碼體系"/> 
<title>測(cè)試</title> 
<effectiveTime value="20220407090145"/> 
<confidentialityCode code="N" codeSystem="2.16.840.1.113883.5.25" codeSystemName="Confidentiality" displayName="正常訪問保密級(jí)別"/> 
<languageCode code="zh-CN"/> 
<setId/> 
<versionNumber/> 
<recordTarget typeCode="RCT" contextControlCode="OP"> 
<patientRole classCode="PAT"> 
<id root="2.16.156.10011.1.11" extension="00000000"/> 
<id root="2.16.156.10011.1.12" extension="00000000"/> 
<id root="2.16.156.10011.1.24" extension="-"/> 
<patient classCode="PSN" determinerCode="INSTANCE"> 
<name>XXX</name> 
<administrativeGenderCode code="1" displayName="男性" codeSystem="2.16.156.10011.2.3.3.4" codeSystemName="生理性別代碼表(GB/T 2261.1)"/> 
<age value="0" unit="歲"/> 
</patient> 
</patientRole> 
</recordTarget> 
</ClinicalDocument>

示例Python

xml = etree.fromstring(new_doc_content.encode('utf-8'))
# 示例的默認(rèn)命名空間是urn:hl7-org:v3,使用xpath需要將命名空間帶上
effective_time = xml.xpath("http://x:effectiveTime[@*]", namespaces={'x': 'urn:hl7-org:v3'})
extension = xml.xpath('//x:recordTarget//x:patientRole/x:id[@extension]',
                                         namespaces={'x': 'urn:hl7-org:v3'})
print(effective_time)
print(extension)

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 使用Docker構(gòu)建Python Flask程序的詳細(xì)教程

    使用Docker構(gòu)建Python Flask程序的詳細(xì)教程

    在當(dāng)今的軟件開發(fā)領(lǐng)域,容器化技術(shù)正變得越來越流行,而 Docker 無疑是其中的佼佼者,本文我們就來聊聊如何使用 Docker 構(gòu)建一個(gè)簡(jiǎn)單的 Python Flask 程序吧
    2025-07-07
  • win10下python2和python3共存問題解決方法

    win10下python2和python3共存問題解決方法

    在本篇文章里小編給大家整理了關(guān)于win10下python2和python3共存問題解決方法,有興趣的朋友們參考下。
    2019-12-12
  • Python3實(shí)現(xiàn)從文件中讀取指定行的方法

    Python3實(shí)現(xiàn)從文件中讀取指定行的方法

    這篇文章主要介紹了Python3實(shí)現(xiàn)從文件中讀取指定行的方法,涉及Python中l(wèi)inecache模塊操作文件的使用技巧,需要的朋友可以參考下
    2015-05-05
  • PyCharm2019安裝教程及其使用(圖文教程)

    PyCharm2019安裝教程及其使用(圖文教程)

    這篇文章主要介紹了PyCharm2019安裝教程(圖文教程),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • Python調(diào)用JS代碼的方法大全

    Python調(diào)用JS代碼的方法大全

    這篇文章主要為大家詳細(xì)介紹了Python調(diào)用JavaScript代碼的三種常用代碼,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-05-05
  • python?pandas?query的使用方法

    python?pandas?query的使用方法

    這篇文章主要介紹了python?pandas?query的使用方法,文章通過圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,感興趣的小伙伴可以參考一下
    2022-09-09
  • Python寫代碼的七條重要技巧介紹

    Python寫代碼的七條重要技巧介紹

    大家好,本篇文章主要講的是Python寫代碼的七條重要技巧介紹,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • python 使用三引號(hào)時(shí)容易犯的小錯(cuò)誤

    python 使用三引號(hào)時(shí)容易犯的小錯(cuò)誤

    這篇文章主要介紹了python 使用三引號(hào)時(shí)容易犯的小錯(cuò)誤,幫助新手學(xué)習(xí),避免入坑,感興趣的朋友可以了解下
    2020-10-10
  • Python使用Ollama API的詳細(xì)代碼示例

    Python使用Ollama API的詳細(xì)代碼示例

    這篇文章主要介紹了如何在Python中使用OllamaAPI,涵蓋了從環(huán)境準(zhǔn)備、使用方法到高級(jí)功能的全面指南,無論是初學(xué)者還是經(jīng)驗(yàn)豐富的開發(fā)者都能從中受益,需要的朋友可以參考下
    2025-02-02
  • python 如何將字典寫為json文件

    python 如何將字典寫為json文件

    這篇文章主要介紹了python 如何將字典寫為json文件的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09

最新評(píng)論

琼结县| 长泰县| 洪泽县| 江门市| 临安市| 白水县| 多伦县| 柞水县| 高尔夫| 九龙坡区| 句容市| 乡城县| 锦州市| 鹤山市| 龙口市| 合山市| 宁明县| 南开区| 潮安县| 旬阳县| 沙河市| 喀什市| 合阳县| 沙坪坝区| 横峰县| 阳城县| 西盟| 万荣县| 饶平县| 阳泉市| 贵德县| 汉源县| 东明县| 兴城市| 营山县| 高密市| 茂名市| 缙云县| 德阳市| 德惠市| 二连浩特市|