الثعبان: إضافة مساحات الأسماء في lxml
-
21-08-2019 - |
سؤال
وأنا أحاول أن تحديد مساحة اسم باستخدام <م> lxml م> على غرار هذا المثال (مأخوذة من <لأ href = "http://www.maconstateit.net/tutorials/XML/XML03/xml03- 01.htm "يختلط =" نوفولو noreferrer "> هنا ):
<TreeInventory xsi:noNamespaceSchemaLocation="Trees.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
</TreeInventory>
وأنا لست متأكدا من كيفية إضافة المثال مخطط لاستخدام وأيضا موقع المخطط. و الوثائق حصلت لي بدأت، عن طريق القيام بشيء مثل:
>>> NS = 'http://www.w3.org/2001/XMLSchema-instance'
>>> TREE = '{%s}' % NS
>>> NSMAP = {None: NS}
>>> tree = etree.Element(TREE + 'TreeInventory', nsmap=NSMAP)
>>> etree.tostring(tree, pretty_print=True)
'<TreeInventory xmlns="http://www.w3.org/2001/XMLSchema-instance"/>\n'
وأنا لست متأكدا من كيفية تحديد ذلك مثيل رغم ذلك، وبعد ذلك أيضا تحديد موقع. يبدو مثل هذا يمكن أن يتم مع nsmap
الكلمة-الارجنتين في etree.Element
، لكنني لا أرى كيف.
المحلول
في بعض المزيد من الخطوات، لوضوح:
>>> NS = 'http://www.w3.org/2001/XMLSchema-instance'
وبقدر ما أستطيع أن أرى، هو noNameSpaceSchemaLocation
السمة التي تريد namespaced، وليس عنصر TreeInventory
. لذلك:
>>> location_attribute = '{%s}noNameSpaceSchemaLocation' % NS
>>> elem = etree.Element('TreeInventory', attrib={location_attribute: 'Trees.xsd'})
>>> etree.tostring(elem, pretty_print=True)
'<TreeInventory xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="Trees.xsd"/>\n'
وهذا يشبه ما تريد ... هل يمكن بالطبع أيضا إنشاء العنصر الأول، دون الصفات، ومن ثم تعيين السمة، مثل هذا:
>>> elem = etree.Element('TreeInventory')
>>> elem.set(location_attribute, 'Trees.xsd')
وأما بالنسبة للمعلمة nsmap
: أعتقد أنه يستخدم فقط لتحديد أي البادئات لاستخدامها في التسلسل. في هذه الحالة، ليست هناك حاجة، لأنه يعرف lxml البادئة تستخدم عادة لمساحة الاسم في السؤال هو "XSI". لو لم يكن بعض مساحة معروفة، هل من المحتمل ان نرى البادئات مثل "ns0"، "NS1" الخ ...، إلا إذا قمت بتحديده التي بادئة كنت تفضل. (تذكر: ليس من المفترض بادئة ليهم)