etree: Defining the default namespace prefix (`""`) with register_namespace has issues
Chưa có ai nhận issue này.
- Ngôn ngữ chính
- Python
- Star
- 77.2k
- Fork
- 36k
- Chỉ số merge pull request
- Chỉ số pull request đang chờ
Mô tả
Bug report
Bug description:
Granted the register_namespace() functionality should be used for 'well known namespace prefixes' but if the the default namespace prefix ("") is registered, the following issues can occur:
Duplicate default namespace attrs xmlns=''
import xml.etree.ElementTree as ET
ET.register_namespace("", "default")
e = ET.Element("{default}elem")
print(ET.tostring(e, default_namespace="otherdefault"))
# b'<elem xmlns="otherdefault" xmlns="default" />'
Incorrect serialisation (the noPrefixElem should raise an error but now it looks like it is in the default namespace):
import xml.etree.ElementTree as ET
ET.register_namespace("", "default")
e = ET.Element("{default}elem")
ET.SubElement(e, "noPrefixElem")
print(ET.tostring(e))
# b'<elem xmlns="default"><noPrefixElem /></elem>'
The two approaches to address this that I can think of are:
- Raise an error if the default namespace is passed to
register_namespace()- Lucky users that register
""but don't use the default prefix's URI anywhere or has every element qualified will have working code with no issues. This would cause their working code to break.
- Lucky users that register
- Handle it properly in
ElementTree._namespaces()by setting the default_namespace var in that function from the global registry if thedefault_namespaceargument isNone- Existing code that 'works' may raise errors about
ValueError: cannot use non-qualified names with default_namespace option, but at least erroneous xml would no longer be emitted - It may be possible to make it so code that was luckily unaffected still doesn't raise an error
- May result in #61290
- Existing code that 'works' may raise errors about
I'm happy to give the second option a try (with implementing any changes required for #61290) as I've also been looking into #57587 that also needs to handle potentially multiple definitions of the default_namespace. My current thinking is that if default_namespace is provided to _namespaces(), it takes precedence even if the default namespace is also defined in the global registry.
CPython versions tested on:
3.12, CPython main branch
Operating systems tested on:
macOS
Linked PRs
- gh-118417
Hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Hướng nghiên cứu
Bắt đầu với xml.etree.ElementTree.register_namespace(), ElementTree._namespaces() và ET.tostring(), sau đó tái hiện cả hai ví dụ trong issue. Xem xét PR được liên kết gh-118417 và hành vi namespace liên quan trước khi chọn mức độ ưu tiên của namespace mặc định. Được xem là hoàn tất khi quá trình tuần tự hóa không còn phát ra các khai báo trùng lặp hoặc âm thầm coi các phần tử không đủ định danh là thuộc namespace mặc định.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Đánh giá
- Công nghệ
- python
- Lĩnh vực
- backend
- Loại issue
- Lỗi
- Độ khó
- 4/5
- Thời gian dự kiến
- 3-5 ngày
- Mức độ hoạt động
- Đình trệ
- Độ rõ ràng
- Khá rõ ràng
- Mức phù hợp với người mới
- 35/100