本文基於W3C-XPath語法:https://www.w3school.com.cn/xpath/xpath_syntax.asp
應用實例xml部分:
<?xml version="1.0" encoding="gb2312" ?>
<AUTO NAME="1499" TOTAL="01">
<INIT TOTAL="02">
<SYSTEM NO="00" NAME="BEK5" AUTOSYSID="14,34">
<INIT_IO CMD="10" TOTAL="09" PROCEDURE="KWP2000_Init_Io">
<STATE NO="00" NAME="BautRate" ID="01" BYTES="02">03,E8</STATE>
</INIT_IO>
<MESSAGEALL>
<MESSAGE MSG_TYPE="00" CS_MODE="00" OVERTIME="03,E8" />
</MESSAGEALL>
<INIT_ECU TOTAL="01" PROCEDURE="B2K_Init_ECU" SPY="01">
<PROTOCOL NO="00" TOTAL="05">
<COMMAND NO="04" CMD="30" RWAYS="01" SEED="6a" LEN="04" POS="02">
<MESSAGE LEN="06">27,0A,00,00,00,00</MESSAGE>
</COMMAND>
</PROTOCOL>
<SPY NO="00" TOTAL="08">
<COMLIST NO="00" TOTAL="01">
<LIST NO="00" CMD="01" POS="08" XBIT="03" REC="00" />
</COMLIST>
</SPY>
</INIT_ECU>
</SYSTEM>
<SYSTEM NO="00" NAME="BEK5" AUTOSYSID="14,34">
<INIT_IO CMD="10" TOTAL="09" PROCEDURE="KWP2000_Init_Io">
<STATE NO="00" NAME="BautRate" ID="01" BYTES="02">03,E8</STATE>
</INIT_IO>
<MESSAGEALL>
<MESSAGE MSG_TYPE="00" CS_MODE="00" OVERTIME="03,E8" />
</MESSAGEALL>
<INIT_ECU TOTAL="01" PROCEDURE="B2K_Init_ECU" SPY="01">
<PROTOCOL NO="00" TOTAL="05">
<COMMAND NO="04" CMD="30" RWAYS="01" SEED="6a" LEN="04" POS="02">
<MESSAGE LEN="06">27,0A,00,00,00,00</MESSAGE>
</COMMAND>
</PROTOCOL>
<SPY NO="00" TOTAL="08">
<COMMAND NO="03" CMD="FF" NUM="00" LEN="03" WAYS="01" STATE="00,03,04,07">
<MESSAGE LEN="06">35,30,30,00,00,00</MESSAGE>
</COMMAND>
</SPY>
</INIT_ECU>
</SYSTEM>
</INIT>
</AUTO>
應用實例代碼:
xml.xpath("/AUTO/INIT//SYSTEM/INIT_ECU//PROTOCOL//COMMAND[MESSAGE[starts-with(text(),'27')]]")
解析:
表達式 | 描述 |
/ | 從根節點選取。篩選首個節點 |
// | 從匹配選擇的當前節點選擇文檔中的節點,而不考慮它們的位置。篩選所有對應節點 |
[condition] | 按條件condition篩選 |
starts-with(text(),str) | 匹配節點值開始字符爲str的節點 |
片段解釋:
/AUTO/INIT//SYSTEM/INIT_ECU//PROTOCOL 解釋:篩選AUTO標籤 下INIT標籤 下所有SYSTEM標籤 下的INIT_ECU標籤下的所有PROTOCOL標籤
//COMMAND[MESSAGE[starts-with(text(),'27')]]
解釋:篩選子標籤MESSAGE標籤值開始字符爲27的所有COMMAND標籤
篩選結果:
<COMMAND NO="04" CMD="30" RWAYS="01" SEED="6a" LEN="04" POS="02">
<MESSAGE LEN="06">27,0A,00,00,00,00</MESSAGE>
</COMMAND>
<COMMAND NO="04" CMD="30" RWAYS="01" SEED="6a" LEN="04" POS="02">
<MESSAGE LEN="06">27,0A,00,00,00,00</MESSAGE>
</COMMAND>