1# jsoup Changelog 2 3## 1.17.2 (2023-Dec-29) 4 5### Improvements 6 7* **Attribute object accessors**: Added `Element.attribute(String)` and `Attributes.attribute(String)` to more simply 8 obtain an `Attribute` object. [2069](https://github.com/jhy/jsoup/issues/2069) 9* **Attribute source tracking**: If source tracking is on, and an Attribute's key is changed ( 10 via `Attribute.setKey(String)`), the source range is now still tracked 11 in `Attribute.sourceRange()`. [2070](https://github.com/jhy/jsoup/issues/2070) 12* **Wildcard attribute selector**: Added support for the `[*]` element with any attribute selector. And also restored 13 support for selecting by an empty attribute name prefix (`[^]`). [2079](https://github.com/jhy/jsoup/issues/2079) 14 15### Bug Fixes 16 17* **Mixed-cased source position**: When tracking the source position of attributes, if the source attribute name was 18 mix-cased but the parser was lower-case normalizing attribute names, the source position for that attribute was not 19 tracked correctly. [2067](https://github.com/jhy/jsoup/issues/2067) 20* **Source position NPE**: When tracking the source position of a body fragment parse, a null pointer 21 exception was thrown. [2068](https://github.com/jhy/jsoup/issues/2068) 22* **Multi-point emoji entity**: A multi-point encoded emoji entity may be incorrectly decoded to the replacement 23 character. [2074](https://github.com/jhy/jsoup/issues/2074) 24* **Selector sub-expressions**: (Regression) in a selector like `parent [attr=va], other`, the `, OR` was binding 25 to `[attr=va]` instead of `parent [attr=va]`, causing incorrect selections. The fix includes a EvaluatorDebug class 26 that generates a sexpr to represent the query, allowing simpler and more thorough query parse 27 tests. [2073](https://github.com/jhy/jsoup/issues/2073) 28* **XML CData output**: When generating XML-syntax output from parsed HTML, script nodes containing (pseudo) CData 29 sections would have an extraneous CData section added, causing script execution errors. Now, the data content is 30 emitted in a HTML/XML/XHTML polyglot format, if the data is not already within a CData 31 section. [2078](https://github.com/jhy/jsoup/issues/2078) 32* **Thread safety**: The `:has` evaluator held a non-thread-safe Iterator, and so if an Evaluator object was 33 shared across multiple concurrent threads, a NoSuchElement exception may be thrown, and the selected results may be 34 incorrect. Now, the iterator object is a thread-local. [2088](https://github.com/jhy/jsoup/issues/2088) 35 36--- 37Older changes for versions 0.1.1 (2010-Jan-31) through 1.17.1 (2023-Nov-27) may be found in 38[change-archive.txt](./change-archive.txt). 39