编程语言
首页 > 编程语言> > java – 如何使用允许jibx中的多个枚举值的属性来解组XML文档?

java – 如何使用允许jibx中的多个枚举值的属性来解组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(使用xjc生成java文件)时,相同的XSD工作正常,所以我认为我的XSD是有效的(尽管如果有更好的方法来定义我想要的东西,那就没问题).

因此,我的问题是:

如何使用允许jibx中的多个枚举值的属性来解组XML文档?

解决方法:

我从您的架构生成了一个带有xjc的RootElement类. attrWithEnum属性的字段变为List< String> attrWithEnum将属性中的每个单词划分为列表中的单独字符串.这将允许任何字符串值,而不仅仅是枚举中定义的值.

将其更改为仅字符串attrWithEnum当然会按原样存储该属性.

我将类型更改为枚举:

enum AttrEnum {
    avalue,
    anothervalue
}
@XmlAttribute(name = "attrWithEnum", required = true)
public List<AttrEnum> attrWithEnum;

使用JAXB(我从未使用过Jibx),这给了我一个只有有效值的列表.枚举中未定义的属性中的任何值都将作为空值返回.

如果该属性仅包含枚举中的一个有效值,则将字段更改为AttrEnum attrWithEnum将仅返回非null值.

所以我的猜测是你的RootElement类将attrWithEnum定义为单个枚举而不是枚举列表(List< AttrEnum>)

标签:java,xml,xsd,unmarshalling,jibx
来源: https://codeday.me/bug/20190708/1401118.html