@XmlAnyElement(lax = true)
означает простым языком что-то вроде:
Уважаемый JAXB! Если у вас есть сопоставление для этого элемента, пожалуйста, распакуйте его
в объект Java. Если вы не знаете этот элемент, просто оставьте его как
Элемент DOM.
Это именно то, что происходит в вашем случае. Поэтому, если вы действительно хотите разархивировать содержимое этого слабого выражения, предоставьте контексту JAXB сопоставление для элемента, который вы хотите разархивировать. Самый простой способ сделать это - добавить в свой класс @XmlRootElement
@XmlRootElement(name="foo", namespace="urn:bar")
public class MyClass { ... }
Теперь, когда вы создаете свой контекст JAXB, добавьте в него MyClass
:
JAXBContext context = JAXBContext.newInstance(A.class, B.class, ..., MyClass.class);
В этом случае, если JAXB встретит элемент {urn:bar}foo
вместо этого xs:any
, он будет знать, что этот элемент сопоставлен с MyClass
и попытается демонтировать MyClass.
Если вы создаете контекст JAXB на основе имени пакета (вы, вероятно, делаете), вы все равно можете добавить к нему свой класс (скажем, com.acme.foo.MyClass
). Самый простой способ - создать ресурс com/acme/foo/jaxb.index
:
com.acme.foo.MyClass
И добавьте имя вашего пакета в контекстный путь:
JAXBContext context = JAXBContext.newInstance("org.dar.gee.schema:com.acme.foo");
Есть и другие способы с ObjectFactory
и т. Д., Но трюк с jaxb.index
, вероятно, самый простой.
В качестве альтернативы, вместо того, чтобы демонтировать все за один прогон, вы можете оставить содержимое xs:any
как DOM и разархивировать его в целевой объект во втором демаршаллинге с другим контекстом JAXB (который знает ваш класс MyClass
). Что-то вроде:
JAXBContext payloadContext = JAXBContext.newInstance(MyClass.class);
payloadContext.createUnmarshaller().unmarshal((Node) myPayload.getAny());
Этот подход иногда лучше, особенно когда у вас есть комбинация схем контейнер / полезная нагрузка, которые относительно независимы. Зависит от случая.
Все сказанное выше относится и к сортировке. Это все аккуратно двунаправленный.