我已经可以在我的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;?
答案 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>
感谢您的回复,测试文档以编程方式创建 ns2作为命名空间可以从代码中读取,问题是我 无法解析这种格式。
使用更正后的@XmlRootElement
信息,使用的前缀并不重要。
如果XML文档中的根元素不是名称空间限定的,则@XmlRootElement
注释不应包含名称空间信息。
@XmlRootElement(name="resources")