使用 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根据架构不能成为根节点。有没有办法只解析一个子树,取回一个项目?
或者,是否有某种方法可以唯一标识子节点,以便我以后找到它?