Как этот XML-файл может быть прочитан JAXB?

1

Я уже могу читать и писать 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"?

Теги:
jaxb

1 ответ

1
Лучший ответ

@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>

ОБНОВЛЕНИЕ # 1

Спасибо за ваш ответ, тестовый документ создается программно с помощью ns2, поскольку пространство имен может быть прочитано из кода, проблема в том, что я не могу разобрать этот формат.

С исправленной информацией @XmlRootElement не имеет значения, что используется префикс.

ОБНОВЛЕНИЕ # 2

Если корневой элемент в вашем XML-документе не является пространством имен, тогда аннотация @XmlRootElement не должна содержать информацию о пространстве имен.

@XmlRootElement(name="resources")
  • 0
    Спасибо за ваш ответ, тестовый документ создается программно с помощью ns2, поскольку пространство имен можно прочитать из кода, проблема в том, что я не могу разобрать этот формат.
  • 0
    @stacker - я обновил свой ответ с некоторой информацией, которая должна помочь.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню