5

2 つの「sub_x.xml」ファイルを含む「main.xml」ファイルがあります。インクルード行は、「xpointer」を使用して、インクルード xml の特定のタグのみを指定/インクルードします。ElementTree を使用してこれが正しく機能したかどうかを判断すると、必要なタグだけでなく、「サブ」xml ファイル全体が含まれていることがわかります。xpointer を間違って使用しているのか、ElementTree または ElementInclude がこれをサポートしていないのかわかりません。ファイルは次のとおりです。

------'main.xml'--------

`<?xml version='1.0' encoding='utf-8'?>
<ModelInfo xmlns:xi="http://www.w3.org/2001/XInclude">
    <xi:include href="sub_1.xml" xpointer="xpointer(//ModelInfo/Model)" parse="xml" />
    <xi:include href="sub_2.xml" xpointer="xpointer(//ModelInfo/Model)" parse="xml" />  
</ModelInfo>`

-------'sub_1.xml'------

`<?xml version="1.0" ?>
<ModelInfo>
  <Model ModelName="glow">
    <Variables>
     <Variable Alias="glow_val" Input="False" Output="True" />
    </Variables>
  </Model>
</ModelInfo>`

-------'sub_2.xml'------

`<?xml version='1.0' encoding='utf-8'?>
<ModelInfo>
  <Model ModelName="sirpwr_b_supply8v1">
   <Variables>
    <Variable Alias="sirpwr_a_supplyecu_Snsr8vIstat" Input="True" Output="False" />
   </Variables>
  </Model>
</ModelInfo>`

「main.xml」が ElementTree に次のように表示されるようにします。

`<?xml version='1.0' encoding='utf-8'?>
<ModelInfo xmlns:xi="http://www.w3.org/2001/XInclude">
  <Model ModelName="glow">
    <Variables>
     <Variable Alias="glow_val" Input="False" Output="True" />
    </Variables>
  </Model>
  <Model ModelName="sirpwr_b_supply8v1">
    <Variables>
     <Variable Alias="sirpwr_a_supplyecu_Snsr8vIstat" Input="True" Output="False" />
     <Variable Alias="sirpwr_b_supply8v1_qstat" Input="False" Output="True" />
   </Variables>
   </Model>
</ModelInfo>`

XML ファイルをロードしてテストするために実行しているスクリプトは次のとおりです。

`tree = ElementTree.parse('main.xml')
root = tree.getroot()
ElementInclude.include(root)
for element in root:
    print element.tag`

「ModelInfo」が「sub_x」xml ファイルからコピーされているため、xpointer が機能していません。

4

1 に答える 1

4

ElementIncludeXInclude のすべてをサポートしているわけではありません。要素のxpointer属性<include>は無視されます。

lxmlxinclude()メソッドを使用すると、希望どおりに機能します。

from lxml import etree 

tree = etree.parse('main.xml')
tree.xinclude()
print etree.tostring(tree)

XPointerxpointer()スキームは W3C 勧告の状態に達していないことに注意してください (これはまだ作業草案です)。これは libxml2 (lxml の背後にある C ライブラリ) に実装されていますが、他の場所にはほとんど実装されていません。

于 2014-05-16T15:49:29.403 に答える