JAXB如何读取此XML文件?

时间:2014-03-31 15:02:20

标签: java xml jaxb

我已经可以在我的unittest中使用JAXB读取和编写XML,但是当我尝试处理实际文件时

我收到此错误: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>

单元测试能够写入(也可以读取):

<?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没有其他选项来设置如何替换名称空间&#34; ns2&#34;通过&#34;工具&#34;?

1 个答案:

答案 0 :(得分: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")