我已经可以在单元测试中使用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没有其他选项可以设置如何用“工具”替换名称空间“ ns2”?

最佳答案

您的@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")

关于java - JAXB如何读取此XML文件?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22765090/

10-11 17:34