Я уже могу читать и писать XML с помощью JAXB в своем unittest, но когда я пытаюсь обработать фактический файл
Я получаю эту ошибку: javax.xml.bind.UnmarshalException: unexpected element (uri:"", local:"resources"). Expected elements are <{}item>,<{}plurals>,<{tools:http://schemas.android.com/tools}resources>,<{}string>
javax.xml.bind.UnmarshalException: unexpected element (uri:"", local:"resources"). Expected elements are <{}item>,<{}plurals>,<{tools:http://schemas.android.com/tools}resources>,<{}string>
Файл выглядит так:
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools" tools:locale="de">
<string name="name1" translatable="false">value 1</string>
<string name="name2" translatable="false">value 2</string>
</resources>
То, что unittest умеет писать (а также читать):
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:resources xmlns:ns2="tools:http://schemas.android.com/tools">
<string name="name1" translatable="false">value1</string>
<string name="name2" translatable="true">value2</string>
<plurals>
<item quantity="one">%d one</item>
<item quantity="other">%d more</item>
</plurals>
</ns2:resources>
Похоже, что xmlns:tools
может вызвать проблему, которая отличается от ns2:resources
которые создаются по какой-то причине.
Элемент контейнера верхнего уровня аннотируется как:
@XmlRootElement(name="resources", namespace = "tools:http://schemas.android.com/tools")
У XmlRootElement нет дополнительных параметров, чтобы указать, как заменить пространство имен "ns2" на "tools"?
@XmlRootElement
сообщает JAXB, что корневой элемент, соответствующий вашему классу, состоит из resources
имен, а пространство имен http://schemas.android.com/tools
- это скорректированная аннодация.
@XmlRootElement(name="resources", namespace = "http://schemas.android.com/tools")
Ваш XML-документ должен гарантировать, что префикс, связанный с пространством имен http://schemas.android.com/tools
используется для префикса элемента resources
.
<?xml version="1.0" encoding="utf-8"?>
<tools:resources xmlns:tools="http://schemas.android.com/tools" tools:locale="de">
<string name="name1" translatable="false">value 1</string>
<string name="name2" translatable="false">value 2</string>
</tools:resources>
или
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:resources xmlns:ns2="http://schemas.android.com/tools">
<string name="name1" translatable="false">value1</string>
<string name="name2" translatable="true">value2</string>
<plurals>
<item quantity="one">%d one</item>
<item quantity="other">%d more</item>
</plurals>
</ns2:resources>
Спасибо за ваш ответ, тестовый документ создается программно с помощью ns2, поскольку пространство имен может быть прочитано из кода, проблема в том, что я не могу разобрать этот формат.
С исправленной информацией @XmlRootElement
не имеет значения, что используется префикс.
Если корневой элемент в вашем XML-документе не является пространством имен, тогда аннотация @XmlRootElement
не должна содержать информацию о пространстве имен.
@XmlRootElement(name="resources")