- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我想使用 Jibx解码以下 XML(存储在名为 test.xml 的文件中):
<?xml version="1.0" encoding="UTF-8"?>
<rootElement attrWithEnum="avalue anothervalue" xsi:schemaLocation="my:target:ns simple.xsd" xmlns="my:target:ns" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
</rootElement>
我这样定义了模式(在一个名为 simple.xsd 的文件中):
<?xml version="1.0" encoding="utf-8"?>
<xs:schema targetNamespace="my:target:ns" xmlns="my:target:ns" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:element name="rootElement">
<xs:complexType>
<xs:attribute name="attrWithEnum" use="required">
<xs:simpleType>
<xs:list>
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="avalue"/>
<xs:enumeration value="anothervalue"/>
</xs:restriction>
</xs:simpleType>
</xs:list>
</xs:simpleType>
</xs:attribute>
</xs:complexType>
</xs:element>
</xs:schema>
使用 org.jibx.schema.codegen.CodeGen
工具从中生成 Java 文件并编写此测试程序:
package test;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import org.jibx.runtime.BindingDirectory;
import org.jibx.runtime.IBindingFactory;
import org.jibx.runtime.IUnmarshallingContext;
import org.jibx.runtime.JiBXException;
import my.target.ns.RootElement;
public final class Program {
public static void main(final String[] args) {
try {
IBindingFactory bfact = BindingDirectory.getFactory(RootElement.class);
IUnmarshallingContext uctx = bfact.createUnmarshallingContext();
FileInputStream in = new FileInputStream(new File("test.xml"));
RootElement data = (RootElement) uctx.unmarshalDocument(in, null);
// This is not what I was expecting. I was expecting
// List<RootElement.Enumeration> (or equivalent) not
// a single RootElement.Enumeration instance
RootElement.Enumeration attrValue = data.getAttrWithEnum();
System.out.println(attrValue);
} catch (Exception e) {
System.out.println(e.toString());
}
}
}
此程序因错误而失败:
org.jibx.runtime.JiBXException: No match found for value 'avalue anothervalue' in enum class my.target.ns.RootElement$Enumeration
如果我像这样调整我的输入 XML(即只设置一个枚举值)它就可以工作(打印 AVALUE
)。
<rootElement attrWithEnum="avalue" xsi:schemaLocation="my:target:ns simple.xsd" xmlns="my:target:ns" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
所以,jibx 似乎不喜欢我想要允许枚举值列表(我期待 getAttrWithEnum
返回一个集合,但它返回一个对象 - 请参阅上面的代码示例)。
当我使用 jaxb 时,相同的 XSD 工作正常(使用 xjc 生成 java 文件),所以我认为我的 XSD 是有效的(尽管如果有更好的方法来定义我想要的,那会很好)。
因此我的问题是:
如何在 jibx 中解码具有允许多个枚举值的属性的 XML 文档?
最佳答案
我生成了一个 RootElement
用xjc
上课从你的模式。该字段为 attrWithEnum
属性变为 List<String> attrWithEnum
这会将属性中的每个单词划分为列表中的单独字符串。这将允许任何字符串值,而不仅仅是枚举中定义的字符串值。
仅将其更改为 String attrWithEnum
当然会按原样存储属性。
我将类型更改为枚举:
enum AttrEnum {
avalue,
anothervalue
}
@XmlAttribute(name = "attrWithEnum", required = true)
public List<AttrEnum> attrWithEnum;
使用 JAXB(我从未使用过 Jibx),这为我提供了一个仅包含有效值的列表。枚举中未定义的属性中的任何值都将作为 null
返回值(value)。
将字段更改为 AttrEnum attrWithEnum
如果属性仅包含枚举中的一个有效值,则只会返回非空值。
所以我猜你的 RootElement
类定义 attrWithEnum
作为一个enum
而不是枚举列表 ( List<AttrEnum>
)
关于java - 我如何解码具有允许在 jibx 中使用多个枚举值的属性的 XML 文档?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29841219/
我是一名优秀的程序员,十分优秀!