0

PyXB を使用して、サブノードをシリアル化し、それを解析できるようにしたいと考えています。スキーマによると、サブノードは有効なルート要素ではないため、単純な方法は機能しません。

私のスキーマ:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="root" type="Root"/>

  <xsd:complexType name="Root">
    <xsd:sequence>
      <xsd:element name="item" maxOccurs="unbounded" type="Item"/>
    </xsd:sequence>
  </xsd:complexType>

  <xsd:complexType name="Item">
    <xsd:sequence>
      <xsd:element name="val"/>
    </xsd:sequence>
  </xsd:complexType>
</xsd:schema>

そしてサンプル XML:

<?xml version="1.0" encoding="utf-8"?>
<root>
    <item>
        <val>1</val>
    </item>
    <item>
        <val>2</val>
    </item>
    <item>
        <val>3</val>
    </item>
</root>

特定のアイテムをシリアル化してからロードできるようにする必要があります。このようなもの:

>>> root = CreateFromDocument(sample)
# locate a sub node to serialize
>>> root.item[1].toxml()
'<?xml version="1.0" ?><item><val>2</val></item>'
# load the sub node, getting an Item back
>>> sub_node = CreateFromDocument('<?xml version="1.0" ?><item><val>2</val></item>')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "binding.py", line 63, in CreateFromDocument
    instance = handler.rootObject()
  File "pyxb/binding/saxer.py", line 285, in rootObject
    raise pyxb.UnrecognizedDOMRootNodeError(self.__rootObject)
pyxb.exceptions_.UnrecognizedDOMRootNodeError: <pyxb.utils.saxdom.Element object at 0x7f30ba4ac550>

# or, perhaps, some kind of unique identifier:
>>> root.item[1].hypothetical_unique_identifier()
'//root/item/1'
>>> sub_node = CreateFromDocument(sample).find_node('//root/item/1')
<binding.Item object at 0x7f30ba4a5d50>

itemスキーマによるとルートノードになることはできないため、これはもちろん機能しません。サブツリーだけを解析して、代わりにアイテムを取得する方法はありますか?

または、後で見つけることができるように、サブノードを一意に識別する方法はありますか?

4

2 に答える 2

0

非グローバル要素の検証オートマトンの状態は開始状態ではないため、PyXB はグローバルではない要素で始まるドキュメントを解析できません。

私は当初、XPathのようなものをサポートすることを考えていましたが、実装されることはありませんでした。また、構造情報を運ぶ標準の一意の識別子もありません。メンバー要素をマークして削除し、後で元の場所に戻す必要がある場合は、追加のプロパティをオブジェクトに割り当てて、アプリケーション レベルで使用することができます。例えば:

e = root.item[1]
e.__mytag = '//root/item/1'

次に、オブジェクト ツリーをたどって一致を検索する関数を作成できます。もちろん、そのような属性はそのインスタンスにのみ関連付けられたままになるため、後で別のオブジェクトを割り当ててもroot.item[1]、同じ属性が自動的に継承されることはありません。

于 2015-10-09T20:18:44.093 に答える