我已经可以在单元测试中使用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/